@@ -221,15 +221,21 @@ fastfloat_really_inline constexpr bool cpp20_and_in_constexpr() {
221
221
222
222
template <typename T>
223
223
struct is_supported_float_type
224
- : std::integral_constant<bool , std::is_same<T, float >::value ||
225
- std::is_same<T, double >::value
224
+ : std::integral_constant<
225
+ bool , std::is_same<T, float >::value || std::is_same<T, double >::value
226
226
#ifdef __STDCPP_FLOAT32_T__
227
- || std::is_same<T, std::float32_t >::value
227
+ || std::is_same<T, std::float32_t >::value
228
228
#endif
229
229
#ifdef __STDCPP_FLOAT64_T__
230
- || std::is_same<T, std::float64_t >::value
230
+ || std::is_same<T, std::float64_t >::value
231
231
#endif
232
- > {
232
+ #ifdef __STDCPP_FLOAT16_T__
233
+ || std::is_same<T, std::float16_t >::value
234
+ #endif
235
+ #ifdef __STDCPP_BFLOAT16_T__
236
+ || std::is_same<T, std::bfloat16_t >::value
237
+ #endif
238
+ > {
233
239
};
234
240
235
241
template <typename T>
@@ -622,6 +628,157 @@ inline constexpr uint64_t binary_format<double>::max_mantissa_fast_path() {
622
628
return uint64_t (2 ) << mantissa_explicit_bits ();
623
629
}
624
630
631
+ // credit: Jakub Jelínek
632
+ #ifdef __STDCPP_FLOAT16_T__
633
+
634
+ template <typename U> struct binary_format_lookup_tables <std::float16_t , U> {
635
+ static constexpr std::float16_t powers_of_ten[] = {};
636
+ static constexpr uint64_t max_mantissa[] = {};
637
+ };
638
+
639
+ template <typename U>
640
+ constexpr std::float16_t
641
+ binary_format_lookup_tables<std::float16_t , U>::powers_of_ten[];
642
+
643
+ template <typename U>
644
+ constexpr uint64_t
645
+ binary_format_lookup_tables<std::float16_t , U>::max_mantissa[];
646
+
647
+ template <>
648
+ inline constexpr int binary_format<std::float16_t >::max_exponent_fast_path() {
649
+ return 0 ;
650
+ }
651
+
652
+ template <>
653
+ inline constexpr uint64_t
654
+ binary_format<std::float16_t >::max_mantissa_fast_path() {
655
+ return 0 ;
656
+ }
657
+
658
+ template <>
659
+ inline constexpr int binary_format<std::float16_t >::min_exponent_fast_path() {
660
+ return 0 ;
661
+ }
662
+
663
+ template <>
664
+ constexpr int binary_format<std::float16_t >::mantissa_explicit_bits() {
665
+ return 10 ;
666
+ }
667
+
668
+ template <>
669
+ constexpr int binary_format<std::float16_t >::max_exponent_round_to_even() {
670
+ return 5 ;
671
+ }
672
+
673
+ template <>
674
+ constexpr int binary_format<std::float16_t >::min_exponent_round_to_even() {
675
+ return -22 ;
676
+ }
677
+
678
+ template <> constexpr int binary_format<std::float16_t >::minimum_exponent() {
679
+ return -15 ;
680
+ }
681
+
682
+ template <> constexpr int binary_format<std::float16_t >::infinite_power() {
683
+ return 0x1F ;
684
+ }
685
+
686
+ template <> constexpr int binary_format<std::float16_t >::sign_index() {
687
+ return 15 ;
688
+ }
689
+
690
+ template <>
691
+ constexpr int binary_format<std::float16_t >::largest_power_of_ten() {
692
+ return 4 ;
693
+ }
694
+
695
+ template <>
696
+ constexpr int binary_format<std::float16_t >::smallest_power_of_ten() {
697
+ return -27 ;
698
+ }
699
+
700
+ template <> constexpr size_t binary_format<std::float16_t >::max_digits() {
701
+ return 22 ;
702
+ }
703
+
704
+ #endif
705
+
706
+ // credit: Jakub Jelínek
707
+ #ifdef __STDCPP_BFLOAT16_T__
708
+
709
+ template <typename U> struct binary_format_lookup_tables <std::bfloat16_t , U> {
710
+ static constexpr std::bfloat16_t powers_of_ten[] = {};
711
+
712
+ static constexpr uint64_t max_mantissa[] = {};
713
+ };
714
+
715
+ template <typename U>
716
+ constexpr std::bfloat16_t
717
+ binary_format_lookup_tables<std::bfloat16_t , U>::powers_of_ten[];
718
+
719
+ template <typename U>
720
+ constexpr uint64_t
721
+ binary_format_lookup_tables<std::bfloat16_t , U>::max_mantissa[];
722
+
723
+ template <>
724
+ inline constexpr int binary_format<std::bfloat16_t >::max_exponent_fast_path() {
725
+ return 0 ;
726
+ }
727
+
728
+ template <>
729
+ inline constexpr uint64_t
730
+ binary_format<std::bfloat16_t >::max_mantissa_fast_path() {
731
+ return 0 ;
732
+ }
733
+
734
+ template <>
735
+ inline constexpr int binary_format<std::bfloat16_t >::min_exponent_fast_path() {
736
+ return 0 ;
737
+ }
738
+
739
+ template <>
740
+ constexpr int binary_format<std::bfloat16_t >::mantissa_explicit_bits() {
741
+ return 7 ;
742
+ }
743
+
744
+ template <>
745
+ constexpr int binary_format<std::bfloat16_t >::max_exponent_round_to_even() {
746
+ return 3 ;
747
+ }
748
+
749
+ template <>
750
+ constexpr int binary_format<std::bfloat16_t >::min_exponent_round_to_even() {
751
+ return -24 ;
752
+ }
753
+
754
+ template <> constexpr int binary_format<std::bfloat16_t >::minimum_exponent() {
755
+ return -127 ;
756
+ }
757
+
758
+ template <> constexpr int binary_format<std::bfloat16_t >::infinite_power() {
759
+ return 0xFF ;
760
+ }
761
+
762
+ template <> constexpr int binary_format<std::bfloat16_t >::sign_index() {
763
+ return 15 ;
764
+ }
765
+
766
+ template <>
767
+ constexpr int binary_format<std::bfloat16_t >::largest_power_of_ten() {
768
+ return 38 ;
769
+ }
770
+
771
+ template <>
772
+ constexpr int binary_format<std::bfloat16_t >::smallest_power_of_ten() {
773
+ return -60 ;
774
+ }
775
+
776
+ template <> constexpr size_t binary_format<std::bfloat16_t >::max_digits() {
777
+ return 98 ;
778
+ }
779
+
780
+ #endif
781
+
625
782
template <>
626
783
inline constexpr uint64_t
627
784
binary_format<double >::max_mantissa_fast_path(int64_t power) {
0 commit comments