@@ -816,6 +816,192 @@ FloatingPoint.test("Float80/Literals") {
816
816
817
817
#endif
818
818
819
+ FloatingPoint.test("Float32/quietNaN") {
820
+ do {
821
+ let f: Float32 = .nan
822
+ expectTrue(f.isNaN && !f.isSignalingNaN)
823
+ expectEqual(0x7fc0_0000, f.bitPattern)
824
+ }
825
+ do {
826
+ // Empty payload
827
+ let f: Float32 = Float32(bitPattern: 0x7fc0_0000)
828
+ expectTrue(f.isNaN && !f.isSignalingNaN)
829
+ }
830
+ do {
831
+ // Full payload
832
+ let f: Float32 = Float32(bitPattern: 0x7fff_ffff)
833
+ expectTrue(f.isNaN && !f.isSignalingNaN)
834
+ }
835
+ do {
836
+ // Highest payload `init(nan:signaling:)` can handle
837
+ let f: Float32 = Float32(nan: 0x1f_ffff, signaling: false)
838
+ expectTrue(f.isNaN && !f.isSignalingNaN)
839
+ expectEqual(0x7fdf_ffff, f.bitPattern)
840
+ }
841
+ do {
842
+ // Payload overflow
843
+ expectCrashLater()
844
+ _ = Float32(nan: 0x20_0000, signaling: false)
845
+ }
846
+ }
847
+
848
+ FloatingPoint.test("Float64/quietNaN") {
849
+ do {
850
+ let f: Float64 = .nan
851
+ expectTrue(f.isNaN && !f.isSignalingNaN)
852
+ expectEqual(0x7ff8_0000_0000_0000, f.bitPattern)
853
+ }
854
+ do {
855
+ // Empty payload
856
+ let f: Float64 = Float64(bitPattern: 0x7ff8_0000_0000_0000)
857
+ expectTrue(f.isNaN && !f.isSignalingNaN)
858
+ }
859
+ do {
860
+ // Full payload
861
+ let f: Float64 = Float64(bitPattern: 0x7fff_ffff_ffff_ffff)
862
+ expectTrue(f.isNaN && !f.isSignalingNaN)
863
+ }
864
+ do {
865
+ // Highest payload `init(nan:signaling:)` can handle
866
+ let f: Float64 = Float64(nan: 0x3_ffff_ffff_ffff, signaling: false)
867
+ expectTrue(f.isNaN && !f.isSignalingNaN)
868
+ expectEqual(0x7ffb_ffff_ffff_ffff, f.bitPattern)
869
+ }
870
+ do {
871
+ // Payload overflow
872
+ expectCrashLater()
873
+ _ = Float64(nan: 0x4_0000_0000_0000, signaling: false)
874
+ }
875
+ }
876
+
877
+ #if arch(i386) || arch(x86_64)
878
+
879
+ FloatingPoint.test("Float80/quietNaN") {
880
+ do {
881
+ let f: Float80 = .nan
882
+ expectTrue(f.isNaN && !f.isSignalingNaN)
883
+ expectEqual(Float80Bits(0x7fff, 0xc000_0000_0000_0000), f.bitPattern)
884
+ }
885
+ do {
886
+ // Empty payload
887
+ let f: Float80 = Float80(bitPattern: Float80Bits(0x7fff, 0xc000_0000_0000_0000))
888
+ expectTrue(f.isNaN && !f.isSignalingNaN)
889
+ }
890
+ do {
891
+ // Full payload
892
+ let f: Float80 = Float80(bitPattern: Float80Bits(0x7fff, 0xffff_ffff_ffff_ffff))
893
+ expectTrue(f.isNaN && !f.isSignalingNaN)
894
+ }
895
+ do {
896
+ // Highest payload `init(nan:signaling:)` can handle
897
+ let f: Float80 = Float80(nan: 0x1fff_ffff_ffff_ffff, signaling: false)
898
+ expectTrue(f.isNaN && !f.isSignalingNaN)
899
+ expectEqual(Float80Bits(0x7fff, 0xdfff_ffff_ffff_ffff), f.bitPattern)
900
+ }
901
+ do {
902
+ // Payload overflow
903
+ expectCrashLater()
904
+ _ = Float80(nan: 0x2000_0000_0000_0000, signaling: false)
905
+ }
906
+ }
907
+
908
+ #endif
909
+
910
+ #if !arch(i386)
911
+
912
+ FloatingPoint.test("Float32/signalingNaN") {
913
+ do {
914
+ let f: Float32 = .signalingNaN
915
+ expectTrue(f.isNaN && f.isSignalingNaN)
916
+ expectEqual(0x7fa0_0000, f.bitPattern)
917
+ }
918
+ do {
919
+ // Empty payload
920
+ let f: Float32 = Float32(bitPattern: 0x7fa0_0000)
921
+ expectTrue(f.isNaN && f.isSignalingNaN)
922
+ }
923
+ do {
924
+ // Full payload
925
+ let f: Float32 = Float32(bitPattern: 0x7fbf_ffff)
926
+ expectTrue(f.isNaN && f.isSignalingNaN)
927
+ }
928
+ do {
929
+ // Highest payload `init(nan:signaling:)` can handle
930
+ let f: Float32 = Float32(nan: 0x1f_ffff, signaling: true)
931
+ expectTrue(f.isNaN && f.isSignalingNaN)
932
+ expectEqual(0x7fbf_ffff, f.bitPattern)
933
+ }
934
+ do {
935
+ // payload overflow
936
+ expectCrashLater()
937
+ _ = Float32(nan: 0x20_0000, signaling: true)
938
+ }
939
+ }
940
+
941
+ FloatingPoint.test("Float64/signalingNaN") {
942
+ do {
943
+ let f: Float64 = .signalingNaN
944
+ expectTrue(f.isNaN && f.isSignalingNaN)
945
+ expectEqual(0x7ff4_0000_0000_0000, f.bitPattern)
946
+ }
947
+ do {
948
+ // Empty payload
949
+ let f: Float64 = Float64(bitPattern: 0x7ff4_0000_0000_0000)
950
+ expectTrue(f.isNaN && f.isSignalingNaN)
951
+ }
952
+ do {
953
+ // Full payload
954
+ let f: Float64 = Float64(bitPattern: 0x7ff7_ffff_ffff_ffff)
955
+ expectTrue(f.isNaN && f.isSignalingNaN)
956
+ }
957
+ do {
958
+ // Highest payload `init(nan:signaling:)` can handle
959
+ let f: Float64 = Float64(nan: 0x3_ffff_ffff_ffff, signaling: true)
960
+ expectTrue(f.isNaN && f.isSignalingNaN)
961
+ expectEqual(0x7ff7_ffff_ffff_ffff, f.bitPattern)
962
+ }
963
+ do {
964
+ // payload overflow
965
+ expectCrashLater()
966
+ _ = Float64(nan: 0x4_0000_0000_0000, signaling: true)
967
+ }
968
+ }
969
+
970
+ #endif
971
+
972
+ #if arch(i386) || arch(x86_64)
973
+
974
+ FloatingPoint.test("Float80/signalingNaN") {
975
+ do {
976
+ let f: Float80 = .signalingNaN
977
+ expectTrue(f.isNaN && f.isSignalingNaN)
978
+ expectEqual(Float80Bits(0x7fff, 0xa000_0000_0000_0000), f.bitPattern)
979
+ }
980
+ do {
981
+ // Empty payload
982
+ let f: Float80 = Float80(bitPattern: Float80Bits(0x7fff, 0xa000_0000_0000_0000))
983
+ expectTrue(f.isNaN && f.isSignalingNaN)
984
+ }
985
+ do {
986
+ // Full payload
987
+ let f: Float80 = Float80(bitPattern: Float80Bits(0x7fff, 0xbfff_ffff_ffff_ffff))
988
+ expectTrue(f.isNaN && f.isSignalingNaN)
989
+ }
990
+ do {
991
+ // Highest payload `init(nan:signaling:)` can handle
992
+ let f: Float80 = Float80(nan: 0x1fff_ffff_ffff_ffff, signaling: true)
993
+ expectTrue(f.isNaN && f.isSignalingNaN)
994
+ expectEqual(Float80Bits(0x7fff, 0xbfff_ffff_ffff_ffff), f.bitPattern)
995
+ }
996
+ do {
997
+ // payload overflow
998
+ expectCrashLater()
999
+ _ = Float80(nan: 0x2000_0000_0000_0000, signaling: true)
1000
+ }
1001
+ }
1002
+
1003
+ #endif
1004
+
819
1005
var FloatingPointClassification = TestSuite("NumericParsing")
820
1006
821
1007
FloatingPointClassification.test("FloatingPointClassification/Equatable") {
0 commit comments