1 use rustc_apfloat::{Category, ExpInt, IEK_INF, IEK_NAN, IEK_ZERO};
2 use rustc_apfloat::{Float, FloatConvert, ParseError, Round, Status};
3 use rustc_apfloat::ieee::{Half, Single, Double, Quad, X87DoubleExtended};
4 use rustc_apfloat::unpack;
7 fn from_f32(input: f32) -> Self;
8 fn to_f32(self) -> f32;
11 impl SingleExt for Single {
12 fn from_f32(input: f32) -> Self {
13 Self::from_bits(input.to_bits() as u128)
16 fn to_f32(self) -> f32 {
17 f32::from_bits(self.to_bits() as u32)
22 fn from_f64(input: f64) -> Self;
23 fn to_f64(self) -> f64;
26 impl DoubleExt for Double {
27 fn from_f64(input: f64) -> Self {
28 Self::from_bits(input.to_bits() as u128)
31 fn to_f64(self) -> f64 {
32 f64::from_bits(self.to_bits() as u64)
38 // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads.
40 assert!(!Single::qnan(None).is_signaling());
41 assert!(!(-Single::qnan(None)).is_signaling());
42 assert!(!Single::qnan(Some(payload)).is_signaling());
43 assert!(!(-Single::qnan(Some(payload))).is_signaling());
44 assert!(Single::snan(None).is_signaling());
45 assert!((-Single::snan(None)).is_signaling());
46 assert!(Single::snan(Some(payload)).is_signaling());
47 assert!((-Single::snan(Some(payload))).is_signaling());
52 // 1. Test Special Cases Values.
54 // Test all special values for nextUp and nextDown perscribed by IEEE-754R
69 // nextUp(+inf) = +inf.
70 let test = unpack!(status=, Quad::INFINITY.next_up());
71 let expected = Quad::INFINITY;
72 assert_eq!(status, Status::OK);
73 assert!(test.is_infinite());
74 assert!(!test.is_negative());
75 assert!(test.bitwise_eq(expected));
77 // nextDown(+inf) = -nextUp(-inf) = -(-largest) = largest
78 let test = unpack!(status=, Quad::INFINITY.next_down());
79 let expected = Quad::largest();
80 assert_eq!(status, Status::OK);
81 assert!(!test.is_negative());
82 assert!(test.bitwise_eq(expected));
84 // nextUp(-inf) = -largest
85 let test = unpack!(status=, (-Quad::INFINITY).next_up());
86 let expected = -Quad::largest();
87 assert_eq!(status, Status::OK);
88 assert!(test.is_negative());
89 assert!(test.bitwise_eq(expected));
91 // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
92 let test = unpack!(status=, (-Quad::INFINITY).next_down());
93 let expected = -Quad::INFINITY;
94 assert_eq!(status, Status::OK);
95 assert!(test.is_infinite() && test.is_negative());
96 assert!(test.bitwise_eq(expected));
98 // nextUp(largest) = +inf
99 let test = unpack!(status=, Quad::largest().next_up());
100 let expected = Quad::INFINITY;
101 assert_eq!(status, Status::OK);
102 assert!(test.is_infinite() && !test.is_negative());
103 assert!(test.bitwise_eq(expected));
105 // nextDown(largest) = -nextUp(-largest)
106 // = -(-largest + inc)
108 let test = unpack!(status=, Quad::largest().next_down());
109 let expected = "0x1.fffffffffffffffffffffffffffep+16383"
112 assert_eq!(status, Status::OK);
113 assert!(!test.is_infinite() && !test.is_negative());
114 assert!(test.bitwise_eq(expected));
116 // nextUp(-largest) = -largest + inc.
117 let test = unpack!(status=, (-Quad::largest()).next_up());
118 let expected = "-0x1.fffffffffffffffffffffffffffep+16383"
121 assert_eq!(status, Status::OK);
122 assert!(test.bitwise_eq(expected));
124 // nextDown(-largest) = -nextUp(largest) = -(inf) = -inf.
125 let test = unpack!(status=, (-Quad::largest()).next_down());
126 let expected = -Quad::INFINITY;
127 assert_eq!(status, Status::OK);
128 assert!(test.is_infinite() && test.is_negative());
129 assert!(test.bitwise_eq(expected));
131 // nextUp(smallest) = smallest + inc.
132 let test = unpack!(status=, "0x0.0000000000000000000000000001p-16382"
136 let expected = "0x0.0000000000000000000000000002p-16382"
139 assert_eq!(status, Status::OK);
140 assert!(test.bitwise_eq(expected));
142 // nextDown(smallest) = -nextUp(-smallest) = -(-0) = +0.
143 let test = unpack!(status=, "0x0.0000000000000000000000000001p-16382"
147 let expected = Quad::ZERO;
148 assert_eq!(status, Status::OK);
149 assert!(test.is_pos_zero());
150 assert!(test.bitwise_eq(expected));
152 // nextUp(-smallest) = -0.
153 let test = unpack!(status=, "-0x0.0000000000000000000000000001p-16382"
157 let expected = -Quad::ZERO;
158 assert_eq!(status, Status::OK);
159 assert!(test.is_neg_zero());
160 assert!(test.bitwise_eq(expected));
162 // nextDown(-smallest) = -nextUp(smallest) = -smallest - inc.
163 let test = unpack!(status=, "-0x0.0000000000000000000000000001p-16382"
167 let expected = "-0x0.0000000000000000000000000002p-16382"
170 assert_eq!(status, Status::OK);
171 assert!(test.bitwise_eq(expected));
173 // nextUp(qNaN) = qNaN
174 let test = unpack!(status=, Quad::qnan(None).next_up());
175 let expected = Quad::qnan(None);
176 assert_eq!(status, Status::OK);
177 assert!(test.bitwise_eq(expected));
179 // nextDown(qNaN) = qNaN
180 let test = unpack!(status=, Quad::qnan(None).next_down());
181 let expected = Quad::qnan(None);
182 assert_eq!(status, Status::OK);
183 assert!(test.bitwise_eq(expected));
185 // nextUp(sNaN) = qNaN
186 let test = unpack!(status=, Quad::snan(None).next_up());
187 let expected = Quad::qnan(None);
188 assert_eq!(status, Status::INVALID_OP);
189 assert!(test.bitwise_eq(expected));
191 // nextDown(sNaN) = qNaN
192 let test = unpack!(status=, Quad::snan(None).next_down());
193 let expected = Quad::qnan(None);
194 assert_eq!(status, Status::INVALID_OP);
195 assert!(test.bitwise_eq(expected));
197 // nextUp(+0) = +smallest
198 let test = unpack!(status=, Quad::ZERO.next_up());
199 let expected = Quad::SMALLEST;
200 assert_eq!(status, Status::OK);
201 assert!(test.bitwise_eq(expected));
203 // nextDown(+0) = -nextUp(-0) = -smallest
204 let test = unpack!(status=, Quad::ZERO.next_down());
205 let expected = -Quad::SMALLEST;
206 assert_eq!(status, Status::OK);
207 assert!(test.bitwise_eq(expected));
209 // nextUp(-0) = +smallest
210 let test = unpack!(status=, (-Quad::ZERO).next_up());
211 let expected = Quad::SMALLEST;
212 assert_eq!(status, Status::OK);
213 assert!(test.bitwise_eq(expected));
215 // nextDown(-0) = -nextUp(0) = -smallest
216 let test = unpack!(status=, (-Quad::ZERO).next_down());
217 let expected = -Quad::SMALLEST;
218 assert_eq!(status, Status::OK);
219 assert!(test.bitwise_eq(expected));
221 // 2. Binade Boundary Tests.
223 // 2a. Test denormal <-> normal binade boundaries.
224 // * nextUp(+Largest Denormal) -> +Smallest Normal.
225 // * nextDown(-Largest Denormal) -> -Smallest Normal.
226 // * nextUp(-Smallest Normal) -> -Largest Denormal.
227 // * nextDown(+Smallest Normal) -> +Largest Denormal.
229 // nextUp(+Largest Denormal) -> +Smallest Normal.
230 let test = unpack!(status=, "0x0.ffffffffffffffffffffffffffffp-16382"
234 let expected = "0x1.0000000000000000000000000000p-16382"
237 assert_eq!(status, Status::OK);
238 assert!(!test.is_denormal());
239 assert!(test.bitwise_eq(expected));
241 // nextDown(-Largest Denormal) -> -Smallest Normal.
242 let test = unpack!(status=, "-0x0.ffffffffffffffffffffffffffffp-16382"
246 let expected = "-0x1.0000000000000000000000000000p-16382"
249 assert_eq!(status, Status::OK);
250 assert!(!test.is_denormal());
251 assert!(test.bitwise_eq(expected));
253 // nextUp(-Smallest Normal) -> -Largest Denormal.
254 let test = unpack!(status=, "-0x1.0000000000000000000000000000p-16382"
258 let expected = "-0x0.ffffffffffffffffffffffffffffp-16382"
261 assert_eq!(status, Status::OK);
262 assert!(test.is_denormal());
263 assert!(test.bitwise_eq(expected));
265 // nextDown(+Smallest Normal) -> +Largest Denormal.
266 let test = unpack!(status=, "+0x1.0000000000000000000000000000p-16382"
270 let expected = "+0x0.ffffffffffffffffffffffffffffp-16382"
273 assert_eq!(status, Status::OK);
274 assert!(test.is_denormal());
275 assert!(test.bitwise_eq(expected));
277 // 2b. Test normal <-> normal binade boundaries.
278 // * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
279 // * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
280 // * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
281 // * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
283 // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
284 let test = unpack!(status=, "-0x1p+1".parse::<Quad>().unwrap().next_up());
285 let expected = "-0x1.ffffffffffffffffffffffffffffp+0"
288 assert_eq!(status, Status::OK);
289 assert!(test.bitwise_eq(expected));
291 // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
292 let test = unpack!(status=, "0x1p+1".parse::<Quad>().unwrap().next_down());
293 let expected = "0x1.ffffffffffffffffffffffffffffp+0"
296 assert_eq!(status, Status::OK);
297 assert!(test.bitwise_eq(expected));
299 // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
300 let test = unpack!(status=, "0x1.ffffffffffffffffffffffffffffp+0"
304 let expected = "0x1p+1".parse::<Quad>().unwrap();
305 assert_eq!(status, Status::OK);
306 assert!(test.bitwise_eq(expected));
308 // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
309 let test = unpack!(status=, "-0x1.ffffffffffffffffffffffffffffp+0"
313 let expected = "-0x1p+1".parse::<Quad>().unwrap();
314 assert_eq!(status, Status::OK);
315 assert!(test.bitwise_eq(expected));
317 // 2c. Test using next at binade boundaries with a direction away from the
318 // binade boundary. Away from denormal <-> normal boundaries.
320 // This is to make sure that even though we are at a binade boundary, since
321 // we are rounding away, we do not trigger the binade boundary code. Thus we
323 // * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
324 // * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
325 // * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
326 // * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
328 // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
329 let test = unpack!(status=, "-0x0.ffffffffffffffffffffffffffffp-16382"
333 let expected = "-0x0.fffffffffffffffffffffffffffep-16382"
336 assert_eq!(status, Status::OK);
337 assert!(test.is_denormal());
338 assert!(test.is_negative());
339 assert!(test.bitwise_eq(expected));
341 // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
342 let test = unpack!(status=, "0x0.ffffffffffffffffffffffffffffp-16382"
346 let expected = "0x0.fffffffffffffffffffffffffffep-16382"
349 assert_eq!(status, Status::OK);
350 assert!(test.is_denormal());
351 assert!(!test.is_negative());
352 assert!(test.bitwise_eq(expected));
354 // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
355 let test = unpack!(status=, "0x1.0000000000000000000000000000p-16382"
359 let expected = "0x1.0000000000000000000000000001p-16382"
362 assert_eq!(status, Status::OK);
363 assert!(!test.is_denormal());
364 assert!(!test.is_negative());
365 assert!(test.bitwise_eq(expected));
367 // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
368 let test = unpack!(status=, "-0x1.0000000000000000000000000000p-16382"
372 let expected = "-0x1.0000000000000000000000000001p-16382"
375 assert_eq!(status, Status::OK);
376 assert!(!test.is_denormal());
377 assert!(test.is_negative());
378 assert!(test.bitwise_eq(expected));
380 // 2d. Test values which cause our exponent to go to min exponent. This
381 // is to ensure that guards in the code to check for min exponent
383 // * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
384 // * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
386 // * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
387 // * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
389 // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
390 let test = unpack!(status=, "-0x1p-16381".parse::<Quad>().unwrap().next_up());
391 let expected = "-0x1.ffffffffffffffffffffffffffffp-16382"
394 assert_eq!(status, Status::OK);
395 assert!(test.bitwise_eq(expected));
397 // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
399 let test = unpack!(status=, "-0x1.ffffffffffffffffffffffffffffp-16382"
403 let expected = "-0x1p-16381".parse::<Quad>().unwrap();
404 assert_eq!(status, Status::OK);
405 assert!(test.bitwise_eq(expected));
407 // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
408 let test = unpack!(status=, "0x1.ffffffffffffffffffffffffffffp-16382"
412 let expected = "0x1p-16381".parse::<Quad>().unwrap();
413 assert_eq!(status, Status::OK);
414 assert!(test.bitwise_eq(expected));
416 // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
417 let test = unpack!(status=, "0x1p-16381".parse::<Quad>().unwrap().next_down());
418 let expected = "0x1.ffffffffffffffffffffffffffffp-16382"
421 assert_eq!(status, Status::OK);
422 assert!(test.bitwise_eq(expected));
424 // 3. Now we test both denormal/normal computation which will not cause us
425 // to go across binade boundaries. Specifically we test:
426 // * nextUp(+Denormal) -> +Denormal.
427 // * nextDown(+Denormal) -> +Denormal.
428 // * nextUp(-Denormal) -> -Denormal.
429 // * nextDown(-Denormal) -> -Denormal.
430 // * nextUp(+Normal) -> +Normal.
431 // * nextDown(+Normal) -> +Normal.
432 // * nextUp(-Normal) -> -Normal.
433 // * nextDown(-Normal) -> -Normal.
435 // nextUp(+Denormal) -> +Denormal.
436 let test = unpack!(status=, "0x0.ffffffffffffffffffffffff000cp-16382"
440 let expected = "0x0.ffffffffffffffffffffffff000dp-16382"
443 assert_eq!(status, Status::OK);
444 assert!(test.is_denormal());
445 assert!(!test.is_negative());
446 assert!(test.bitwise_eq(expected));
448 // nextDown(+Denormal) -> +Denormal.
449 let test = unpack!(status=, "0x0.ffffffffffffffffffffffff000cp-16382"
453 let expected = "0x0.ffffffffffffffffffffffff000bp-16382"
456 assert_eq!(status, Status::OK);
457 assert!(test.is_denormal());
458 assert!(!test.is_negative());
459 assert!(test.bitwise_eq(expected));
461 // nextUp(-Denormal) -> -Denormal.
462 let test = unpack!(status=, "-0x0.ffffffffffffffffffffffff000cp-16382"
466 let expected = "-0x0.ffffffffffffffffffffffff000bp-16382"
469 assert_eq!(status, Status::OK);
470 assert!(test.is_denormal());
471 assert!(test.is_negative());
472 assert!(test.bitwise_eq(expected));
474 // nextDown(-Denormal) -> -Denormal
475 let test = unpack!(status=, "-0x0.ffffffffffffffffffffffff000cp-16382"
479 let expected = "-0x0.ffffffffffffffffffffffff000dp-16382"
482 assert_eq!(status, Status::OK);
483 assert!(test.is_denormal());
484 assert!(test.is_negative());
485 assert!(test.bitwise_eq(expected));
487 // nextUp(+Normal) -> +Normal.
488 let test = unpack!(status=, "0x1.ffffffffffffffffffffffff000cp-16000"
492 let expected = "0x1.ffffffffffffffffffffffff000dp-16000"
495 assert_eq!(status, Status::OK);
496 assert!(!test.is_denormal());
497 assert!(!test.is_negative());
498 assert!(test.bitwise_eq(expected));
500 // nextDown(+Normal) -> +Normal.
501 let test = unpack!(status=, "0x1.ffffffffffffffffffffffff000cp-16000"
505 let expected = "0x1.ffffffffffffffffffffffff000bp-16000"
508 assert_eq!(status, Status::OK);
509 assert!(!test.is_denormal());
510 assert!(!test.is_negative());
511 assert!(test.bitwise_eq(expected));
513 // nextUp(-Normal) -> -Normal.
514 let test = unpack!(status=, "-0x1.ffffffffffffffffffffffff000cp-16000"
518 let expected = "-0x1.ffffffffffffffffffffffff000bp-16000"
521 assert_eq!(status, Status::OK);
522 assert!(!test.is_denormal());
523 assert!(test.is_negative());
524 assert!(test.bitwise_eq(expected));
526 // nextDown(-Normal) -> -Normal.
527 let test = unpack!(status=, "-0x1.ffffffffffffffffffffffff000cp-16000"
531 let expected = "-0x1.ffffffffffffffffffffffff000dp-16000"
534 assert_eq!(status, Status::OK);
535 assert!(!test.is_denormal());
536 assert!(test.is_negative());
537 assert!(test.bitwise_eq(expected));
543 let mut f1 = Single::from_f32(14.5);
544 let f2 = Single::from_f32(-14.5);
545 let f3 = Single::from_f32(225.0);
546 f1 = f1.mul_add(f2, f3).value;
547 assert_eq!(14.75, f1.to_f32());
551 let val2 = Single::from_f32(2.0);
552 let mut f1 = Single::from_f32(1.17549435e-38);
553 let mut f2 = Single::from_f32(1.17549435e-38);
556 let f3 = Single::from_f32(12.0);
557 f1 = f1.mul_add(f2, f3).value;
558 assert_eq!(12.0, f1.to_f32());
561 // Test for correct zero sign when answer is exactly zero.
562 // fma(1.0, -1.0, 1.0) -> +ve 0.
564 let mut f1 = Double::from_f64(1.0);
565 let f2 = Double::from_f64(-1.0);
566 let f3 = Double::from_f64(1.0);
567 f1 = f1.mul_add(f2, f3).value;
568 assert!(!f1.is_negative() && f1.is_zero());
571 // Test for correct zero sign when answer is exactly zero and rounding towards
573 // fma(1.0, -1.0, 1.0) -> +ve 0.
575 let mut f1 = Double::from_f64(1.0);
576 let f2 = Double::from_f64(-1.0);
577 let f3 = Double::from_f64(1.0);
578 f1 = f1.mul_add_r(f2, f3, Round::TowardNegative).value;
579 assert!(f1.is_negative() && f1.is_zero());
582 // Test for correct (in this case -ve) sign when adding like signed zeros.
583 // Test fma(0.0, -0.0, -0.0) -> -ve 0.
585 let mut f1 = Double::from_f64(0.0);
586 let f2 = Double::from_f64(-0.0);
587 let f3 = Double::from_f64(-0.0);
588 f1 = f1.mul_add(f2, f3).value;
589 assert!(f1.is_negative() && f1.is_zero());
592 // Test -ve sign preservation when small negative results underflow.
594 let mut f1 = "-0x1p-1074".parse::<Double>().unwrap();
595 let f2 = "+0x1p-1074".parse::<Double>().unwrap();
596 let f3 = Double::from_f64(0.0);
597 f1 = f1.mul_add(f2, f3).value;
598 assert!(f1.is_negative() && f1.is_zero());
601 // Test x87 extended precision case from http://llvm.org/PR20728.
603 let mut m1 = X87DoubleExtended::from_u128(1).value;
604 let m2 = X87DoubleExtended::from_u128(1).value;
605 let a = X87DoubleExtended::from_u128(3).value;
607 let mut loses_info = false;
608 m1 = m1.mul_add(m2, a).value;
609 let r: Single = m1.convert(&mut loses_info).value;
610 assert!(!loses_info);
611 assert_eq!(4.0, r.to_f32());
617 let f1 = Double::from_f64(1.0);
618 let f2 = Double::from_f64(2.0);
619 let nan = Double::NAN;
621 assert_eq!(1.0, f1.min(f2).to_f64());
622 assert_eq!(1.0, f2.min(f1).to_f64());
623 assert_eq!(1.0, f1.min(nan).to_f64());
624 assert_eq!(1.0, nan.min(f1).to_f64());
629 let f1 = Double::from_f64(1.0);
630 let f2 = Double::from_f64(2.0);
631 let nan = Double::NAN;
633 assert_eq!(2.0, f1.max(f2).to_f64());
634 assert_eq!(2.0, f2.max(f1).to_f64());
635 assert_eq!(1.0, f1.max(nan).to_f64());
636 assert_eq!(1.0, nan.max(f1).to_f64());
641 // Test single precision
643 assert!(!Single::from_f32(0.0).is_denormal());
645 let mut t = "1.17549435082228750797e-38".parse::<Single>().unwrap();
646 assert!(!t.is_denormal());
648 let val2 = Single::from_f32(2.0e0);
650 assert!(t.is_denormal());
653 // Test double precision
655 assert!(!Double::from_f64(0.0).is_denormal());
657 let mut t = "2.22507385850720138309e-308".parse::<Double>().unwrap();
658 assert!(!t.is_denormal());
660 let val2 = Double::from_f64(2.0e0);
662 assert!(t.is_denormal());
665 // Test Intel double-ext
667 assert!(!X87DoubleExtended::from_u128(0).value.is_denormal());
669 let mut t = "3.36210314311209350626e-4932"
670 .parse::<X87DoubleExtended>()
672 assert!(!t.is_denormal());
674 t /= X87DoubleExtended::from_u128(2).value;
675 assert!(t.is_denormal());
678 // Test quadruple precision
680 assert!(!Quad::from_u128(0).value.is_denormal());
682 let mut t = "3.36210314311209350626267781732175260e-4932"
685 assert!(!t.is_denormal());
687 t /= Quad::from_u128(2).value;
688 assert!(t.is_denormal());
693 fn decimal_strings_without_null_terminators() {
694 // Make sure that we can parse strings without null terminators.
696 let val = "0.00"[..3].parse::<Double>().unwrap();
697 assert_eq!(val.to_f64(), 0.0);
698 let val = "0.01"[..3].parse::<Double>().unwrap();
699 assert_eq!(val.to_f64(), 0.0);
700 let val = "0.09"[..3].parse::<Double>().unwrap();
701 assert_eq!(val.to_f64(), 0.0);
702 let val = "0.095"[..4].parse::<Double>().unwrap();
703 assert_eq!(val.to_f64(), 0.09);
704 let val = "0.00e+3"[..7].parse::<Double>().unwrap();
705 assert_eq!(val.to_f64(), 0.00);
706 let val = "0e+3"[..4].parse::<Double>().unwrap();
707 assert_eq!(val.to_f64(), 0.00);
712 fn from_zero_decimal_string() {
713 assert_eq!(0.0, "0".parse::<Double>().unwrap().to_f64());
714 assert_eq!(0.0, "+0".parse::<Double>().unwrap().to_f64());
715 assert_eq!(-0.0, "-0".parse::<Double>().unwrap().to_f64());
717 assert_eq!(0.0, "0.".parse::<Double>().unwrap().to_f64());
718 assert_eq!(0.0, "+0.".parse::<Double>().unwrap().to_f64());
719 assert_eq!(-0.0, "-0.".parse::<Double>().unwrap().to_f64());
721 assert_eq!(0.0, ".0".parse::<Double>().unwrap().to_f64());
722 assert_eq!(0.0, "+.0".parse::<Double>().unwrap().to_f64());
723 assert_eq!(-0.0, "-.0".parse::<Double>().unwrap().to_f64());
725 assert_eq!(0.0, "0.0".parse::<Double>().unwrap().to_f64());
726 assert_eq!(0.0, "+0.0".parse::<Double>().unwrap().to_f64());
727 assert_eq!(-0.0, "-0.0".parse::<Double>().unwrap().to_f64());
729 assert_eq!(0.0, "00000.".parse::<Double>().unwrap().to_f64());
730 assert_eq!(0.0, "+00000.".parse::<Double>().unwrap().to_f64());
731 assert_eq!(-0.0, "-00000.".parse::<Double>().unwrap().to_f64());
733 assert_eq!(0.0, ".00000".parse::<Double>().unwrap().to_f64());
734 assert_eq!(0.0, "+.00000".parse::<Double>().unwrap().to_f64());
735 assert_eq!(-0.0, "-.00000".parse::<Double>().unwrap().to_f64());
737 assert_eq!(0.0, "0000.00000".parse::<Double>().unwrap().to_f64());
738 assert_eq!(0.0, "+0000.00000".parse::<Double>().unwrap().to_f64());
739 assert_eq!(-0.0, "-0000.00000".parse::<Double>().unwrap().to_f64());
743 fn from_zero_decimal_single_exponent_string() {
744 assert_eq!(0.0, "0e1".parse::<Double>().unwrap().to_f64());
745 assert_eq!(0.0, "+0e1".parse::<Double>().unwrap().to_f64());
746 assert_eq!(-0.0, "-0e1".parse::<Double>().unwrap().to_f64());
748 assert_eq!(0.0, "0e+1".parse::<Double>().unwrap().to_f64());
749 assert_eq!(0.0, "+0e+1".parse::<Double>().unwrap().to_f64());
750 assert_eq!(-0.0, "-0e+1".parse::<Double>().unwrap().to_f64());
752 assert_eq!(0.0, "0e-1".parse::<Double>().unwrap().to_f64());
753 assert_eq!(0.0, "+0e-1".parse::<Double>().unwrap().to_f64());
754 assert_eq!(-0.0, "-0e-1".parse::<Double>().unwrap().to_f64());
757 assert_eq!(0.0, "0.e1".parse::<Double>().unwrap().to_f64());
758 assert_eq!(0.0, "+0.e1".parse::<Double>().unwrap().to_f64());
759 assert_eq!(-0.0, "-0.e1".parse::<Double>().unwrap().to_f64());
761 assert_eq!(0.0, "0.e+1".parse::<Double>().unwrap().to_f64());
762 assert_eq!(0.0, "+0.e+1".parse::<Double>().unwrap().to_f64());
763 assert_eq!(-0.0, "-0.e+1".parse::<Double>().unwrap().to_f64());
765 assert_eq!(0.0, "0.e-1".parse::<Double>().unwrap().to_f64());
766 assert_eq!(0.0, "+0.e-1".parse::<Double>().unwrap().to_f64());
767 assert_eq!(-0.0, "-0.e-1".parse::<Double>().unwrap().to_f64());
769 assert_eq!(0.0, ".0e1".parse::<Double>().unwrap().to_f64());
770 assert_eq!(0.0, "+.0e1".parse::<Double>().unwrap().to_f64());
771 assert_eq!(-0.0, "-.0e1".parse::<Double>().unwrap().to_f64());
773 assert_eq!(0.0, ".0e+1".parse::<Double>().unwrap().to_f64());
774 assert_eq!(0.0, "+.0e+1".parse::<Double>().unwrap().to_f64());
775 assert_eq!(-0.0, "-.0e+1".parse::<Double>().unwrap().to_f64());
777 assert_eq!(0.0, ".0e-1".parse::<Double>().unwrap().to_f64());
778 assert_eq!(0.0, "+.0e-1".parse::<Double>().unwrap().to_f64());
779 assert_eq!(-0.0, "-.0e-1".parse::<Double>().unwrap().to_f64());
782 assert_eq!(0.0, "0.0e1".parse::<Double>().unwrap().to_f64());
783 assert_eq!(0.0, "+0.0e1".parse::<Double>().unwrap().to_f64());
784 assert_eq!(-0.0, "-0.0e1".parse::<Double>().unwrap().to_f64());
786 assert_eq!(0.0, "0.0e+1".parse::<Double>().unwrap().to_f64());
787 assert_eq!(0.0, "+0.0e+1".parse::<Double>().unwrap().to_f64());
788 assert_eq!(-0.0, "-0.0e+1".parse::<Double>().unwrap().to_f64());
790 assert_eq!(0.0, "0.0e-1".parse::<Double>().unwrap().to_f64());
791 assert_eq!(0.0, "+0.0e-1".parse::<Double>().unwrap().to_f64());
792 assert_eq!(-0.0, "-0.0e-1".parse::<Double>().unwrap().to_f64());
795 assert_eq!(0.0, "000.0000e1".parse::<Double>().unwrap().to_f64());
796 assert_eq!(0.0, "+000.0000e+1".parse::<Double>().unwrap().to_f64());
797 assert_eq!(-0.0, "-000.0000e+1".parse::<Double>().unwrap().to_f64());
801 fn from_zero_decimal_large_exponent_string() {
802 assert_eq!(0.0, "0e1234".parse::<Double>().unwrap().to_f64());
803 assert_eq!(0.0, "+0e1234".parse::<Double>().unwrap().to_f64());
804 assert_eq!(-0.0, "-0e1234".parse::<Double>().unwrap().to_f64());
806 assert_eq!(0.0, "0e+1234".parse::<Double>().unwrap().to_f64());
807 assert_eq!(0.0, "+0e+1234".parse::<Double>().unwrap().to_f64());
808 assert_eq!(-0.0, "-0e+1234".parse::<Double>().unwrap().to_f64());
810 assert_eq!(0.0, "0e-1234".parse::<Double>().unwrap().to_f64());
811 assert_eq!(0.0, "+0e-1234".parse::<Double>().unwrap().to_f64());
812 assert_eq!(-0.0, "-0e-1234".parse::<Double>().unwrap().to_f64());
814 assert_eq!(0.0, "000.0000e1234".parse::<Double>().unwrap().to_f64());
815 assert_eq!(0.0, "000.0000e-1234".parse::<Double>().unwrap().to_f64());
819 fn from_zero_hexadecimal_string() {
820 assert_eq!(0.0, "0x0p1".parse::<Double>().unwrap().to_f64());
821 assert_eq!(0.0, "+0x0p1".parse::<Double>().unwrap().to_f64());
822 assert_eq!(-0.0, "-0x0p1".parse::<Double>().unwrap().to_f64());
824 assert_eq!(0.0, "0x0p+1".parse::<Double>().unwrap().to_f64());
825 assert_eq!(0.0, "+0x0p+1".parse::<Double>().unwrap().to_f64());
826 assert_eq!(-0.0, "-0x0p+1".parse::<Double>().unwrap().to_f64());
828 assert_eq!(0.0, "0x0p-1".parse::<Double>().unwrap().to_f64());
829 assert_eq!(0.0, "+0x0p-1".parse::<Double>().unwrap().to_f64());
830 assert_eq!(-0.0, "-0x0p-1".parse::<Double>().unwrap().to_f64());
833 assert_eq!(0.0, "0x0.p1".parse::<Double>().unwrap().to_f64());
834 assert_eq!(0.0, "+0x0.p1".parse::<Double>().unwrap().to_f64());
835 assert_eq!(-0.0, "-0x0.p1".parse::<Double>().unwrap().to_f64());
837 assert_eq!(0.0, "0x0.p+1".parse::<Double>().unwrap().to_f64());
838 assert_eq!(0.0, "+0x0.p+1".parse::<Double>().unwrap().to_f64());
839 assert_eq!(-0.0, "-0x0.p+1".parse::<Double>().unwrap().to_f64());
841 assert_eq!(0.0, "0x0.p-1".parse::<Double>().unwrap().to_f64());
842 assert_eq!(0.0, "+0x0.p-1".parse::<Double>().unwrap().to_f64());
843 assert_eq!(-0.0, "-0x0.p-1".parse::<Double>().unwrap().to_f64());
846 assert_eq!(0.0, "0x.0p1".parse::<Double>().unwrap().to_f64());
847 assert_eq!(0.0, "+0x.0p1".parse::<Double>().unwrap().to_f64());
848 assert_eq!(-0.0, "-0x.0p1".parse::<Double>().unwrap().to_f64());
850 assert_eq!(0.0, "0x.0p+1".parse::<Double>().unwrap().to_f64());
851 assert_eq!(0.0, "+0x.0p+1".parse::<Double>().unwrap().to_f64());
852 assert_eq!(-0.0, "-0x.0p+1".parse::<Double>().unwrap().to_f64());
854 assert_eq!(0.0, "0x.0p-1".parse::<Double>().unwrap().to_f64());
855 assert_eq!(0.0, "+0x.0p-1".parse::<Double>().unwrap().to_f64());
856 assert_eq!(-0.0, "-0x.0p-1".parse::<Double>().unwrap().to_f64());
859 assert_eq!(0.0, "0x0.0p1".parse::<Double>().unwrap().to_f64());
860 assert_eq!(0.0, "+0x0.0p1".parse::<Double>().unwrap().to_f64());
861 assert_eq!(-0.0, "-0x0.0p1".parse::<Double>().unwrap().to_f64());
863 assert_eq!(0.0, "0x0.0p+1".parse::<Double>().unwrap().to_f64());
864 assert_eq!(0.0, "+0x0.0p+1".parse::<Double>().unwrap().to_f64());
865 assert_eq!(-0.0, "-0x0.0p+1".parse::<Double>().unwrap().to_f64());
867 assert_eq!(0.0, "0x0.0p-1".parse::<Double>().unwrap().to_f64());
868 assert_eq!(0.0, "+0x0.0p-1".parse::<Double>().unwrap().to_f64());
869 assert_eq!(-0.0, "-0x0.0p-1".parse::<Double>().unwrap().to_f64());
872 assert_eq!(0.0, "0x00000.p1".parse::<Double>().unwrap().to_f64());
873 assert_eq!(0.0, "0x0000.00000p1".parse::<Double>().unwrap().to_f64());
874 assert_eq!(0.0, "0x.00000p1".parse::<Double>().unwrap().to_f64());
875 assert_eq!(0.0, "0x0.p1".parse::<Double>().unwrap().to_f64());
876 assert_eq!(0.0, "0x0p1234".parse::<Double>().unwrap().to_f64());
877 assert_eq!(-0.0, "-0x0p1234".parse::<Double>().unwrap().to_f64());
878 assert_eq!(0.0, "0x00000.p1234".parse::<Double>().unwrap().to_f64());
879 assert_eq!(0.0, "0x0000.00000p1234".parse::<Double>().unwrap().to_f64());
880 assert_eq!(0.0, "0x.00000p1234".parse::<Double>().unwrap().to_f64());
881 assert_eq!(0.0, "0x0.p1234".parse::<Double>().unwrap().to_f64());
885 fn from_decimal_string() {
886 assert_eq!(1.0, "1".parse::<Double>().unwrap().to_f64());
887 assert_eq!(2.0, "2.".parse::<Double>().unwrap().to_f64());
888 assert_eq!(0.5, ".5".parse::<Double>().unwrap().to_f64());
889 assert_eq!(1.0, "1.0".parse::<Double>().unwrap().to_f64());
890 assert_eq!(-2.0, "-2".parse::<Double>().unwrap().to_f64());
891 assert_eq!(-4.0, "-4.".parse::<Double>().unwrap().to_f64());
892 assert_eq!(-0.5, "-.5".parse::<Double>().unwrap().to_f64());
893 assert_eq!(-1.5, "-1.5".parse::<Double>().unwrap().to_f64());
894 assert_eq!(1.25e12, "1.25e12".parse::<Double>().unwrap().to_f64());
895 assert_eq!(1.25e+12, "1.25e+12".parse::<Double>().unwrap().to_f64());
896 assert_eq!(1.25e-12, "1.25e-12".parse::<Double>().unwrap().to_f64());
897 assert_eq!(1024.0, "1024.".parse::<Double>().unwrap().to_f64());
898 assert_eq!(1024.05, "1024.05000".parse::<Double>().unwrap().to_f64());
899 assert_eq!(0.05, ".05000".parse::<Double>().unwrap().to_f64());
900 assert_eq!(2.0, "2.".parse::<Double>().unwrap().to_f64());
901 assert_eq!(2.0e2, "2.e2".parse::<Double>().unwrap().to_f64());
902 assert_eq!(2.0e+2, "2.e+2".parse::<Double>().unwrap().to_f64());
903 assert_eq!(2.0e-2, "2.e-2".parse::<Double>().unwrap().to_f64());
904 assert_eq!(2.05e2, "002.05000e2".parse::<Double>().unwrap().to_f64());
905 assert_eq!(2.05e+2, "002.05000e+2".parse::<Double>().unwrap().to_f64());
906 assert_eq!(2.05e-2, "002.05000e-2".parse::<Double>().unwrap().to_f64());
907 assert_eq!(2.05e12, "002.05000e12".parse::<Double>().unwrap().to_f64());
910 "002.05000e+12".parse::<Double>().unwrap().to_f64()
914 "002.05000e-12".parse::<Double>().unwrap().to_f64()
917 // These are "carefully selected" to overflow the fast log-base
918 // calculations in the implementation.
919 assert!("99e99999".parse::<Double>().unwrap().is_infinite());
920 assert!("-99e99999".parse::<Double>().unwrap().is_infinite());
921 assert!("1e-99999".parse::<Double>().unwrap().is_pos_zero());
922 assert!("-1e-99999".parse::<Double>().unwrap().is_neg_zero());
924 assert_eq!(2.71828, "2.71828".parse::<Double>().unwrap().to_f64());
928 fn from_hexadecimal_string() {
929 assert_eq!(1.0, "0x1p0".parse::<Double>().unwrap().to_f64());
930 assert_eq!(1.0, "+0x1p0".parse::<Double>().unwrap().to_f64());
931 assert_eq!(-1.0, "-0x1p0".parse::<Double>().unwrap().to_f64());
933 assert_eq!(1.0, "0x1p+0".parse::<Double>().unwrap().to_f64());
934 assert_eq!(1.0, "+0x1p+0".parse::<Double>().unwrap().to_f64());
935 assert_eq!(-1.0, "-0x1p+0".parse::<Double>().unwrap().to_f64());
937 assert_eq!(1.0, "0x1p-0".parse::<Double>().unwrap().to_f64());
938 assert_eq!(1.0, "+0x1p-0".parse::<Double>().unwrap().to_f64());
939 assert_eq!(-1.0, "-0x1p-0".parse::<Double>().unwrap().to_f64());
942 assert_eq!(2.0, "0x1p1".parse::<Double>().unwrap().to_f64());
943 assert_eq!(2.0, "+0x1p1".parse::<Double>().unwrap().to_f64());
944 assert_eq!(-2.0, "-0x1p1".parse::<Double>().unwrap().to_f64());
946 assert_eq!(2.0, "0x1p+1".parse::<Double>().unwrap().to_f64());
947 assert_eq!(2.0, "+0x1p+1".parse::<Double>().unwrap().to_f64());
948 assert_eq!(-2.0, "-0x1p+1".parse::<Double>().unwrap().to_f64());
950 assert_eq!(0.5, "0x1p-1".parse::<Double>().unwrap().to_f64());
951 assert_eq!(0.5, "+0x1p-1".parse::<Double>().unwrap().to_f64());
952 assert_eq!(-0.5, "-0x1p-1".parse::<Double>().unwrap().to_f64());
955 assert_eq!(3.0, "0x1.8p1".parse::<Double>().unwrap().to_f64());
956 assert_eq!(3.0, "+0x1.8p1".parse::<Double>().unwrap().to_f64());
957 assert_eq!(-3.0, "-0x1.8p1".parse::<Double>().unwrap().to_f64());
959 assert_eq!(3.0, "0x1.8p+1".parse::<Double>().unwrap().to_f64());
960 assert_eq!(3.0, "+0x1.8p+1".parse::<Double>().unwrap().to_f64());
961 assert_eq!(-3.0, "-0x1.8p+1".parse::<Double>().unwrap().to_f64());
963 assert_eq!(0.75, "0x1.8p-1".parse::<Double>().unwrap().to_f64());
964 assert_eq!(0.75, "+0x1.8p-1".parse::<Double>().unwrap().to_f64());
965 assert_eq!(-0.75, "-0x1.8p-1".parse::<Double>().unwrap().to_f64());
968 assert_eq!(8192.0, "0x1000.000p1".parse::<Double>().unwrap().to_f64());
969 assert_eq!(8192.0, "+0x1000.000p1".parse::<Double>().unwrap().to_f64());
970 assert_eq!(-8192.0, "-0x1000.000p1".parse::<Double>().unwrap().to_f64());
972 assert_eq!(8192.0, "0x1000.000p+1".parse::<Double>().unwrap().to_f64());
973 assert_eq!(8192.0, "+0x1000.000p+1".parse::<Double>().unwrap().to_f64());
976 "-0x1000.000p+1".parse::<Double>().unwrap().to_f64()
979 assert_eq!(2048.0, "0x1000.000p-1".parse::<Double>().unwrap().to_f64());
980 assert_eq!(2048.0, "+0x1000.000p-1".parse::<Double>().unwrap().to_f64());
983 "-0x1000.000p-1".parse::<Double>().unwrap().to_f64()
987 assert_eq!(8192.0, "0x1000p1".parse::<Double>().unwrap().to_f64());
988 assert_eq!(8192.0, "+0x1000p1".parse::<Double>().unwrap().to_f64());
989 assert_eq!(-8192.0, "-0x1000p1".parse::<Double>().unwrap().to_f64());
991 assert_eq!(8192.0, "0x1000p+1".parse::<Double>().unwrap().to_f64());
992 assert_eq!(8192.0, "+0x1000p+1".parse::<Double>().unwrap().to_f64());
993 assert_eq!(-8192.0, "-0x1000p+1".parse::<Double>().unwrap().to_f64());
995 assert_eq!(2048.0, "0x1000p-1".parse::<Double>().unwrap().to_f64());
996 assert_eq!(2048.0, "+0x1000p-1".parse::<Double>().unwrap().to_f64());
997 assert_eq!(-2048.0, "-0x1000p-1".parse::<Double>().unwrap().to_f64());
1000 assert_eq!(16384.0, "0x10p10".parse::<Double>().unwrap().to_f64());
1001 assert_eq!(16384.0, "+0x10p10".parse::<Double>().unwrap().to_f64());
1002 assert_eq!(-16384.0, "-0x10p10".parse::<Double>().unwrap().to_f64());
1004 assert_eq!(16384.0, "0x10p+10".parse::<Double>().unwrap().to_f64());
1005 assert_eq!(16384.0, "+0x10p+10".parse::<Double>().unwrap().to_f64());
1006 assert_eq!(-16384.0, "-0x10p+10".parse::<Double>().unwrap().to_f64());
1008 assert_eq!(0.015625, "0x10p-10".parse::<Double>().unwrap().to_f64());
1009 assert_eq!(0.015625, "+0x10p-10".parse::<Double>().unwrap().to_f64());
1010 assert_eq!(-0.015625, "-0x10p-10".parse::<Double>().unwrap().to_f64());
1012 assert_eq!(1.0625, "0x1.1p0".parse::<Double>().unwrap().to_f64());
1013 assert_eq!(1.0, "0x1p0".parse::<Double>().unwrap().to_f64());
1016 "0x1p-150".parse::<Double>().unwrap().to_f64(),
1017 "+0x800000000000000001.p-221"
1024 "0x80000000000004000000.010p-28"
1033 let to_string = |d: f64, precision: usize, width: usize| {
1034 let x = Double::from_f64(d);
1036 format!("{:1$}", x, width)
1038 format!("{:2$.1$}", x, precision, width)
1041 assert_eq!("10", to_string(10.0, 6, 3));
1042 assert_eq!("1.0E+1", to_string(10.0, 6, 0));
1043 assert_eq!("10100", to_string(1.01E+4, 5, 2));
1044 assert_eq!("1.01E+4", to_string(1.01E+4, 4, 2));
1045 assert_eq!("1.01E+4", to_string(1.01E+4, 5, 1));
1046 assert_eq!("0.0101", to_string(1.01E-2, 5, 2));
1047 assert_eq!("0.0101", to_string(1.01E-2, 4, 2));
1048 assert_eq!("1.01E-2", to_string(1.01E-2, 5, 1));
1050 "0.78539816339744828",
1051 to_string(0.78539816339744830961, 0, 3)
1054 "4.9406564584124654E-324",
1055 to_string(4.9406564584124654e-324, 0, 3)
1057 assert_eq!("873.18340000000001", to_string(873.1834, 0, 1));
1058 assert_eq!("8.7318340000000001E+2", to_string(873.1834, 0, 0));
1060 "1.7976931348623157E+308",
1061 to_string(1.7976931348623157E+308, 0, 0)
1064 let to_string = |d: f64, precision: usize, width: usize| {
1065 let x = Double::from_f64(d);
1067 format!("{:#1$}", x, width)
1069 format!("{:#2$.1$}", x, precision, width)
1072 assert_eq!("10", to_string(10.0, 6, 3));
1073 assert_eq!("1.000000e+01", to_string(10.0, 6, 0));
1074 assert_eq!("10100", to_string(1.01E+4, 5, 2));
1075 assert_eq!("1.0100e+04", to_string(1.01E+4, 4, 2));
1076 assert_eq!("1.01000e+04", to_string(1.01E+4, 5, 1));
1077 assert_eq!("0.0101", to_string(1.01E-2, 5, 2));
1078 assert_eq!("0.0101", to_string(1.01E-2, 4, 2));
1079 assert_eq!("1.01000e-02", to_string(1.01E-2, 5, 1));
1081 "0.78539816339744828",
1082 to_string(0.78539816339744830961, 0, 3)
1085 "4.94065645841246540e-324",
1086 to_string(4.9406564584124654e-324, 0, 3)
1088 assert_eq!("873.18340000000001", to_string(873.1834, 0, 1));
1089 assert_eq!("8.73183400000000010e+02", to_string(873.1834, 0, 0));
1091 "1.79769313486231570e+308",
1092 to_string(1.7976931348623157E+308, 0, 0)
1098 let mut is_exact = false;
1102 "10".parse::<Double>().unwrap().to_u128_r(
1111 Status::INVALID_OP.and(0),
1112 "-10".parse::<Double>().unwrap().to_u128_r(
1121 Status::INVALID_OP.and(31),
1122 "32".parse::<Double>().unwrap().to_u128_r(
1131 Status::INEXACT.and(7),
1132 "7.9".parse::<Double>().unwrap().to_u128_r(
1141 Status::OK.and(-10),
1142 "-10".parse::<Double>().unwrap().to_i128_r(
1151 Status::INVALID_OP.and(-16),
1152 "-17".parse::<Double>().unwrap().to_i128_r(
1161 Status::INVALID_OP.and(15),
1162 "16".parse::<Double>().unwrap().to_i128_r(
1173 fn nanbits<T: Float>(signaling: bool, negative: bool, fill: u128) -> u128 {
1174 let x = if signaling {
1186 assert_eq!(0x7fc00000, nanbits::<Single>(false, false, 0));
1187 assert_eq!(0xffc00000, nanbits::<Single>(false, true, 0));
1188 assert_eq!(0x7fc0ae72, nanbits::<Single>(false, false, 0xae72));
1189 assert_eq!(0x7fffae72, nanbits::<Single>(false, false, 0xffffae72));
1190 assert_eq!(0x7fa00000, nanbits::<Single>(true, false, 0));
1191 assert_eq!(0xffa00000, nanbits::<Single>(true, true, 0));
1192 assert_eq!(0x7f80ae72, nanbits::<Single>(true, false, 0xae72));
1193 assert_eq!(0x7fbfae72, nanbits::<Single>(true, false, 0xffffae72));
1195 assert_eq!(0x7ff8000000000000, nanbits::<Double>(false, false, 0));
1196 assert_eq!(0xfff8000000000000, nanbits::<Double>(false, true, 0));
1197 assert_eq!(0x7ff800000000ae72, nanbits::<Double>(false, false, 0xae72));
1200 nanbits::<Double>(false, false, 0xffffffffffffae72)
1202 assert_eq!(0x7ff4000000000000, nanbits::<Double>(true, false, 0));
1203 assert_eq!(0xfff4000000000000, nanbits::<Double>(true, true, 0));
1204 assert_eq!(0x7ff000000000ae72, nanbits::<Double>(true, false, 0xae72));
1207 nanbits::<Double>(true, false, 0xffffffffffffae72)
1212 fn string_decimal_death() {
1214 "".parse::<Double>(),
1215 Err(ParseError("Invalid string length"))
1218 "+".parse::<Double>(),
1219 Err(ParseError("String has no digits"))
1222 "-".parse::<Double>(),
1223 Err(ParseError("String has no digits"))
1227 "\0".parse::<Double>(),
1228 Err(ParseError("Invalid character in significand"))
1231 "1\0".parse::<Double>(),
1232 Err(ParseError("Invalid character in significand"))
1235 "1\02".parse::<Double>(),
1236 Err(ParseError("Invalid character in significand"))
1239 "1\02e1".parse::<Double>(),
1240 Err(ParseError("Invalid character in significand"))
1243 "1e\0".parse::<Double>(),
1244 Err(ParseError("Invalid character in exponent"))
1247 "1e1\0".parse::<Double>(),
1248 Err(ParseError("Invalid character in exponent"))
1251 "1e1\02".parse::<Double>(),
1252 Err(ParseError("Invalid character in exponent"))
1256 "1.0f".parse::<Double>(),
1257 Err(ParseError("Invalid character in significand"))
1261 "..".parse::<Double>(),
1262 Err(ParseError("String contains multiple dots"))
1265 "..0".parse::<Double>(),
1266 Err(ParseError("String contains multiple dots"))
1269 "1.0.0".parse::<Double>(),
1270 Err(ParseError("String contains multiple dots"))
1275 fn string_decimal_significand_death() {
1277 ".".parse::<Double>(),
1278 Err(ParseError("Significand has no digits"))
1281 "+.".parse::<Double>(),
1282 Err(ParseError("Significand has no digits"))
1285 "-.".parse::<Double>(),
1286 Err(ParseError("Significand has no digits"))
1291 "e".parse::<Double>(),
1292 Err(ParseError("Significand has no digits"))
1295 "+e".parse::<Double>(),
1296 Err(ParseError("Significand has no digits"))
1299 "-e".parse::<Double>(),
1300 Err(ParseError("Significand has no digits"))
1304 "e1".parse::<Double>(),
1305 Err(ParseError("Significand has no digits"))
1308 "+e1".parse::<Double>(),
1309 Err(ParseError("Significand has no digits"))
1312 "-e1".parse::<Double>(),
1313 Err(ParseError("Significand has no digits"))
1317 ".e1".parse::<Double>(),
1318 Err(ParseError("Significand has no digits"))
1321 "+.e1".parse::<Double>(),
1322 Err(ParseError("Significand has no digits"))
1325 "-.e1".parse::<Double>(),
1326 Err(ParseError("Significand has no digits"))
1331 ".e".parse::<Double>(),
1332 Err(ParseError("Significand has no digits"))
1335 "+.e".parse::<Double>(),
1336 Err(ParseError("Significand has no digits"))
1339 "-.e".parse::<Double>(),
1340 Err(ParseError("Significand has no digits"))
1345 fn string_decimal_exponent_death() {
1347 "1e".parse::<Double>(),
1348 Err(ParseError("Exponent has no digits"))
1351 "+1e".parse::<Double>(),
1352 Err(ParseError("Exponent has no digits"))
1355 "-1e".parse::<Double>(),
1356 Err(ParseError("Exponent has no digits"))
1360 "1.e".parse::<Double>(),
1361 Err(ParseError("Exponent has no digits"))
1364 "+1.e".parse::<Double>(),
1365 Err(ParseError("Exponent has no digits"))
1368 "-1.e".parse::<Double>(),
1369 Err(ParseError("Exponent has no digits"))
1373 ".1e".parse::<Double>(),
1374 Err(ParseError("Exponent has no digits"))
1377 "+.1e".parse::<Double>(),
1378 Err(ParseError("Exponent has no digits"))
1381 "-.1e".parse::<Double>(),
1382 Err(ParseError("Exponent has no digits"))
1386 "1.1e".parse::<Double>(),
1387 Err(ParseError("Exponent has no digits"))
1390 "+1.1e".parse::<Double>(),
1391 Err(ParseError("Exponent has no digits"))
1394 "-1.1e".parse::<Double>(),
1395 Err(ParseError("Exponent has no digits"))
1400 "1e+".parse::<Double>(),
1401 Err(ParseError("Exponent has no digits"))
1404 "1e-".parse::<Double>(),
1405 Err(ParseError("Exponent has no digits"))
1409 ".1e".parse::<Double>(),
1410 Err(ParseError("Exponent has no digits"))
1413 ".1e+".parse::<Double>(),
1414 Err(ParseError("Exponent has no digits"))
1417 ".1e-".parse::<Double>(),
1418 Err(ParseError("Exponent has no digits"))
1422 "1.0e".parse::<Double>(),
1423 Err(ParseError("Exponent has no digits"))
1426 "1.0e+".parse::<Double>(),
1427 Err(ParseError("Exponent has no digits"))
1430 "1.0e-".parse::<Double>(),
1431 Err(ParseError("Exponent has no digits"))
1436 fn string_hexadecimal_death() {
1437 assert_eq!("0x".parse::<Double>(), Err(ParseError("Invalid string")));
1438 assert_eq!("+0x".parse::<Double>(), Err(ParseError("Invalid string")));
1439 assert_eq!("-0x".parse::<Double>(), Err(ParseError("Invalid string")));
1442 "0x0".parse::<Double>(),
1443 Err(ParseError("Hex strings require an exponent"))
1446 "+0x0".parse::<Double>(),
1447 Err(ParseError("Hex strings require an exponent"))
1450 "-0x0".parse::<Double>(),
1451 Err(ParseError("Hex strings require an exponent"))
1455 "0x0.".parse::<Double>(),
1456 Err(ParseError("Hex strings require an exponent"))
1459 "+0x0.".parse::<Double>(),
1460 Err(ParseError("Hex strings require an exponent"))
1463 "-0x0.".parse::<Double>(),
1464 Err(ParseError("Hex strings require an exponent"))
1468 "0x.0".parse::<Double>(),
1469 Err(ParseError("Hex strings require an exponent"))
1472 "+0x.0".parse::<Double>(),
1473 Err(ParseError("Hex strings require an exponent"))
1476 "-0x.0".parse::<Double>(),
1477 Err(ParseError("Hex strings require an exponent"))
1481 "0x0.0".parse::<Double>(),
1482 Err(ParseError("Hex strings require an exponent"))
1485 "+0x0.0".parse::<Double>(),
1486 Err(ParseError("Hex strings require an exponent"))
1489 "-0x0.0".parse::<Double>(),
1490 Err(ParseError("Hex strings require an exponent"))
1494 "0x\0".parse::<Double>(),
1495 Err(ParseError("Invalid character in significand"))
1498 "0x1\0".parse::<Double>(),
1499 Err(ParseError("Invalid character in significand"))
1502 "0x1\02".parse::<Double>(),
1503 Err(ParseError("Invalid character in significand"))
1506 "0x1\02p1".parse::<Double>(),
1507 Err(ParseError("Invalid character in significand"))
1510 "0x1p\0".parse::<Double>(),
1511 Err(ParseError("Invalid character in exponent"))
1514 "0x1p1\0".parse::<Double>(),
1515 Err(ParseError("Invalid character in exponent"))
1518 "0x1p1\02".parse::<Double>(),
1519 Err(ParseError("Invalid character in exponent"))
1523 "0x1p0f".parse::<Double>(),
1524 Err(ParseError("Invalid character in exponent"))
1528 "0x..p1".parse::<Double>(),
1529 Err(ParseError("String contains multiple dots"))
1532 "0x..0p1".parse::<Double>(),
1533 Err(ParseError("String contains multiple dots"))
1536 "0x1.0.0p1".parse::<Double>(),
1537 Err(ParseError("String contains multiple dots"))
1542 fn string_hexadecimal_significand_death() {
1544 "0x.".parse::<Double>(),
1545 Err(ParseError("Significand has no digits"))
1548 "+0x.".parse::<Double>(),
1549 Err(ParseError("Significand has no digits"))
1552 "-0x.".parse::<Double>(),
1553 Err(ParseError("Significand has no digits"))
1557 "0xp".parse::<Double>(),
1558 Err(ParseError("Significand has no digits"))
1561 "+0xp".parse::<Double>(),
1562 Err(ParseError("Significand has no digits"))
1565 "-0xp".parse::<Double>(),
1566 Err(ParseError("Significand has no digits"))
1570 "0xp+".parse::<Double>(),
1571 Err(ParseError("Significand has no digits"))
1574 "+0xp+".parse::<Double>(),
1575 Err(ParseError("Significand has no digits"))
1578 "-0xp+".parse::<Double>(),
1579 Err(ParseError("Significand has no digits"))
1583 "0xp-".parse::<Double>(),
1584 Err(ParseError("Significand has no digits"))
1587 "+0xp-".parse::<Double>(),
1588 Err(ParseError("Significand has no digits"))
1591 "-0xp-".parse::<Double>(),
1592 Err(ParseError("Significand has no digits"))
1597 "0x.p".parse::<Double>(),
1598 Err(ParseError("Significand has no digits"))
1601 "+0x.p".parse::<Double>(),
1602 Err(ParseError("Significand has no digits"))
1605 "-0x.p".parse::<Double>(),
1606 Err(ParseError("Significand has no digits"))
1610 "0x.p+".parse::<Double>(),
1611 Err(ParseError("Significand has no digits"))
1614 "+0x.p+".parse::<Double>(),
1615 Err(ParseError("Significand has no digits"))
1618 "-0x.p+".parse::<Double>(),
1619 Err(ParseError("Significand has no digits"))
1623 "0x.p-".parse::<Double>(),
1624 Err(ParseError("Significand has no digits"))
1627 "+0x.p-".parse::<Double>(),
1628 Err(ParseError("Significand has no digits"))
1631 "-0x.p-".parse::<Double>(),
1632 Err(ParseError("Significand has no digits"))
1637 fn string_hexadecimal_exponent_death() {
1639 "0x1p".parse::<Double>(),
1640 Err(ParseError("Exponent has no digits"))
1643 "+0x1p".parse::<Double>(),
1644 Err(ParseError("Exponent has no digits"))
1647 "-0x1p".parse::<Double>(),
1648 Err(ParseError("Exponent has no digits"))
1652 "0x1p+".parse::<Double>(),
1653 Err(ParseError("Exponent has no digits"))
1656 "+0x1p+".parse::<Double>(),
1657 Err(ParseError("Exponent has no digits"))
1660 "-0x1p+".parse::<Double>(),
1661 Err(ParseError("Exponent has no digits"))
1665 "0x1p-".parse::<Double>(),
1666 Err(ParseError("Exponent has no digits"))
1669 "+0x1p-".parse::<Double>(),
1670 Err(ParseError("Exponent has no digits"))
1673 "-0x1p-".parse::<Double>(),
1674 Err(ParseError("Exponent has no digits"))
1679 "0x1.p".parse::<Double>(),
1680 Err(ParseError("Exponent has no digits"))
1683 "+0x1.p".parse::<Double>(),
1684 Err(ParseError("Exponent has no digits"))
1687 "-0x1.p".parse::<Double>(),
1688 Err(ParseError("Exponent has no digits"))
1692 "0x1.p+".parse::<Double>(),
1693 Err(ParseError("Exponent has no digits"))
1696 "+0x1.p+".parse::<Double>(),
1697 Err(ParseError("Exponent has no digits"))
1700 "-0x1.p+".parse::<Double>(),
1701 Err(ParseError("Exponent has no digits"))
1705 "0x1.p-".parse::<Double>(),
1706 Err(ParseError("Exponent has no digits"))
1709 "+0x1.p-".parse::<Double>(),
1710 Err(ParseError("Exponent has no digits"))
1713 "-0x1.p-".parse::<Double>(),
1714 Err(ParseError("Exponent has no digits"))
1719 "0x.1p".parse::<Double>(),
1720 Err(ParseError("Exponent has no digits"))
1723 "+0x.1p".parse::<Double>(),
1724 Err(ParseError("Exponent has no digits"))
1727 "-0x.1p".parse::<Double>(),
1728 Err(ParseError("Exponent has no digits"))
1732 "0x.1p+".parse::<Double>(),
1733 Err(ParseError("Exponent has no digits"))
1736 "+0x.1p+".parse::<Double>(),
1737 Err(ParseError("Exponent has no digits"))
1740 "-0x.1p+".parse::<Double>(),
1741 Err(ParseError("Exponent has no digits"))
1745 "0x.1p-".parse::<Double>(),
1746 Err(ParseError("Exponent has no digits"))
1749 "+0x.1p-".parse::<Double>(),
1750 Err(ParseError("Exponent has no digits"))
1753 "-0x.1p-".parse::<Double>(),
1754 Err(ParseError("Exponent has no digits"))
1759 "0x1.1p".parse::<Double>(),
1760 Err(ParseError("Exponent has no digits"))
1763 "+0x1.1p".parse::<Double>(),
1764 Err(ParseError("Exponent has no digits"))
1767 "-0x1.1p".parse::<Double>(),
1768 Err(ParseError("Exponent has no digits"))
1772 "0x1.1p+".parse::<Double>(),
1773 Err(ParseError("Exponent has no digits"))
1776 "+0x1.1p+".parse::<Double>(),
1777 Err(ParseError("Exponent has no digits"))
1780 "-0x1.1p+".parse::<Double>(),
1781 Err(ParseError("Exponent has no digits"))
1785 "0x1.1p-".parse::<Double>(),
1786 Err(ParseError("Exponent has no digits"))
1789 "+0x1.1p-".parse::<Double>(),
1790 Err(ParseError("Exponent has no digits"))
1793 "-0x1.1p-".parse::<Double>(),
1794 Err(ParseError("Exponent has no digits"))
1799 fn exact_inverse() {
1800 // Trivial operation.
1802 Double::from_f64(2.0)
1803 .get_exact_inverse()
1805 .bitwise_eq(Double::from_f64(0.5))
1808 Single::from_f32(2.0)
1809 .get_exact_inverse()
1811 .bitwise_eq(Single::from_f32(0.5))
1817 .get_exact_inverse()
1819 .bitwise_eq("0.5".parse::<Quad>().unwrap())
1823 .parse::<X87DoubleExtended>()
1825 .get_exact_inverse()
1827 .bitwise_eq("0.5".parse::<X87DoubleExtended>().unwrap())
1832 Single::from_f32(1.17549435e-38)
1833 .get_exact_inverse()
1835 .bitwise_eq(Single::from_f32(8.5070592e+37))
1838 // Large float, inverse is a denormal.
1839 assert!(Single::from_f32(1.7014118e38).get_exact_inverse().is_none());
1841 assert!(Double::from_f64(0.0).get_exact_inverse().is_none());
1842 // Denormalized float
1844 Single::from_f32(1.40129846e-45)
1845 .get_exact_inverse()
1851 fn round_to_integral() {
1852 let t = Double::from_f64(-0.5);
1853 assert_eq!(-0.0, t.round_to_integral(Round::TowardZero).value.to_f64());
1856 t.round_to_integral(Round::TowardNegative).value.to_f64()
1860 t.round_to_integral(Round::TowardPositive).value.to_f64()
1864 t.round_to_integral(Round::NearestTiesToEven).value.to_f64()
1867 let s = Double::from_f64(3.14);
1868 assert_eq!(3.0, s.round_to_integral(Round::TowardZero).value.to_f64());
1871 s.round_to_integral(Round::TowardNegative).value.to_f64()
1875 s.round_to_integral(Round::TowardPositive).value.to_f64()
1879 s.round_to_integral(Round::NearestTiesToEven).value.to_f64()
1882 let r = Double::largest();
1885 r.round_to_integral(Round::TowardZero).value.to_f64()
1889 r.round_to_integral(Round::TowardNegative).value.to_f64()
1893 r.round_to_integral(Round::TowardPositive).value.to_f64()
1897 r.round_to_integral(Round::NearestTiesToEven).value.to_f64()
1900 let p = Double::ZERO.round_to_integral(Round::TowardZero).value;
1901 assert_eq!(0.0, p.to_f64());
1902 let p = (-Double::ZERO).round_to_integral(Round::TowardZero).value;
1903 assert_eq!(-0.0, p.to_f64());
1904 let p = Double::NAN.round_to_integral(Round::TowardZero).value;
1905 assert!(p.to_f64().is_nan());
1906 let p = Double::INFINITY.round_to_integral(Round::TowardZero).value;
1907 assert!(p.to_f64().is_infinite() && p.to_f64() > 0.0);
1908 let p = (-Double::INFINITY)
1909 .round_to_integral(Round::TowardZero)
1911 assert!(p.to_f64().is_infinite() && p.to_f64() < 0.0);
1916 let t = Double::from_f64(-0.0);
1917 assert!(t.is_integer());
1918 let t = Double::from_f64(3.14159);
1919 assert!(!t.is_integer());
1920 let t = Double::NAN;
1921 assert!(!t.is_integer());
1922 let t = Double::INFINITY;
1923 assert!(!t.is_integer());
1924 let t = -Double::INFINITY;
1925 assert!(!t.is_integer());
1926 let t = Double::largest();
1927 assert!(t.is_integer());
1932 assert_eq!(3.402823466e+38, Single::largest().to_f32());
1933 assert_eq!(1.7976931348623158e+308, Double::largest().to_f64());
1938 let test = Single::SMALLEST;
1939 let expected = "0x0.000002p-126".parse::<Single>().unwrap();
1940 assert!(!test.is_negative());
1941 assert!(test.is_finite_non_zero());
1942 assert!(test.is_denormal());
1943 assert!(test.bitwise_eq(expected));
1945 let test = -Single::SMALLEST;
1946 let expected = "-0x0.000002p-126".parse::<Single>().unwrap();
1947 assert!(test.is_negative());
1948 assert!(test.is_finite_non_zero());
1949 assert!(test.is_denormal());
1950 assert!(test.bitwise_eq(expected));
1952 let test = Quad::SMALLEST;
1953 let expected = "0x0.0000000000000000000000000001p-16382"
1956 assert!(!test.is_negative());
1957 assert!(test.is_finite_non_zero());
1958 assert!(test.is_denormal());
1959 assert!(test.bitwise_eq(expected));
1961 let test = -Quad::SMALLEST;
1962 let expected = "-0x0.0000000000000000000000000001p-16382"
1965 assert!(test.is_negative());
1966 assert!(test.is_finite_non_zero());
1967 assert!(test.is_denormal());
1968 assert!(test.bitwise_eq(expected));
1972 fn smallest_normalized() {
1973 let test = Single::smallest_normalized();
1974 let expected = "0x1p-126".parse::<Single>().unwrap();
1975 assert!(!test.is_negative());
1976 assert!(test.is_finite_non_zero());
1977 assert!(!test.is_denormal());
1978 assert!(test.bitwise_eq(expected));
1980 let test = -Single::smallest_normalized();
1981 let expected = "-0x1p-126".parse::<Single>().unwrap();
1982 assert!(test.is_negative());
1983 assert!(test.is_finite_non_zero());
1984 assert!(!test.is_denormal());
1985 assert!(test.bitwise_eq(expected));
1987 let test = Quad::smallest_normalized();
1988 let expected = "0x1p-16382".parse::<Quad>().unwrap();
1989 assert!(!test.is_negative());
1990 assert!(test.is_finite_non_zero());
1991 assert!(!test.is_denormal());
1992 assert!(test.bitwise_eq(expected));
1994 let test = -Quad::smallest_normalized();
1995 let expected = "-0x1p-16382".parse::<Quad>().unwrap();
1996 assert!(test.is_negative());
1997 assert!(test.is_finite_non_zero());
1998 assert!(!test.is_denormal());
1999 assert!(test.bitwise_eq(expected));
2004 assert_eq!(0.0, Single::from_f32(0.0).to_f32());
2005 assert_eq!(-0.0, Single::from_f32(-0.0).to_f32());
2006 assert!(Single::from_f32(-0.0).is_negative());
2008 assert_eq!(0.0, Double::from_f64(0.0).to_f64());
2009 assert_eq!(-0.0, Double::from_f64(-0.0).to_f64());
2010 assert!(Double::from_f64(-0.0).is_negative());
2012 fn test<T: Float>(sign: bool, bits: u128) {
2013 let test = if sign { -T::ZERO } else { T::ZERO };
2014 let pattern = if sign { "-0x0p+0" } else { "0x0p+0" };
2015 let expected = pattern.parse::<T>().unwrap();
2016 assert!(test.is_zero());
2017 assert_eq!(sign, test.is_negative());
2018 assert!(test.bitwise_eq(expected));
2019 assert_eq!(bits, test.to_bits());
2021 test::<Half>(false, 0);
2022 test::<Half>(true, 0x8000);
2023 test::<Single>(false, 0);
2024 test::<Single>(true, 0x80000000);
2025 test::<Double>(false, 0);
2026 test::<Double>(true, 0x8000000000000000);
2027 test::<Quad>(false, 0);
2028 test::<Quad>(true, 0x8000000000000000_0000000000000000);
2029 test::<X87DoubleExtended>(false, 0);
2030 test::<X87DoubleExtended>(true, 0x8000_0000000000000000);
2035 assert!(Double::from_f64(-42.0).bitwise_eq(
2036 Double::from_f64(42.0).copy_sign(
2037 Double::from_f64(-1.0),
2040 assert!(Double::from_f64(42.0).bitwise_eq(
2041 Double::from_f64(-42.0).copy_sign(
2042 Double::from_f64(1.0),
2045 assert!(Double::from_f64(-42.0).bitwise_eq(
2046 Double::from_f64(-42.0).copy_sign(
2047 Double::from_f64(-1.0),
2050 assert!(Double::from_f64(42.0).bitwise_eq(
2051 Double::from_f64(42.0).copy_sign(
2052 Double::from_f64(1.0),
2059 let mut loses_info = false;
2060 let test = "1.0".parse::<Double>().unwrap();
2061 let test: Single = test.convert(&mut loses_info).value;
2062 assert_eq!(1.0, test.to_f32());
2063 assert!(!loses_info);
2065 let mut test = "0x1p-53".parse::<X87DoubleExtended>().unwrap();
2066 let one = "1.0".parse::<X87DoubleExtended>().unwrap();
2068 let test: Double = test.convert(&mut loses_info).value;
2069 assert_eq!(1.0, test.to_f64());
2070 assert!(loses_info);
2072 let mut test = "0x1p-53".parse::<Quad>().unwrap();
2073 let one = "1.0".parse::<Quad>().unwrap();
2075 let test: Double = test.convert(&mut loses_info).value;
2076 assert_eq!(1.0, test.to_f64());
2077 assert!(loses_info);
2079 let test = "0xf.fffffffp+28".parse::<X87DoubleExtended>().unwrap();
2080 let test: Double = test.convert(&mut loses_info).value;
2081 assert_eq!(4294967295.0, test.to_f64());
2082 assert!(!loses_info);
2084 let test = Single::snan(None);
2085 let x87_snan = X87DoubleExtended::snan(None);
2086 let test: X87DoubleExtended = test.convert(&mut loses_info).value;
2087 assert!(test.bitwise_eq(x87_snan));
2088 assert!(!loses_info);
2090 let test = Single::qnan(None);
2091 let x87_qnan = X87DoubleExtended::qnan(None);
2092 let test: X87DoubleExtended = test.convert(&mut loses_info).value;
2093 assert!(test.bitwise_eq(x87_qnan));
2094 assert!(!loses_info);
2096 let test = X87DoubleExtended::snan(None);
2097 let test: X87DoubleExtended = test.convert(&mut loses_info).value;
2098 assert!(test.bitwise_eq(x87_snan));
2099 assert!(!loses_info);
2101 let test = X87DoubleExtended::qnan(None);
2102 let test: X87DoubleExtended = test.convert(&mut loses_info).value;
2103 assert!(test.bitwise_eq(x87_qnan));
2104 assert!(!loses_info);
2109 let t = "0x1p+0".parse::<Single>().unwrap();
2110 assert!(!t.is_negative());
2111 let t = "-0x1p+0".parse::<Single>().unwrap();
2112 assert!(t.is_negative());
2114 assert!(!Single::INFINITY.is_negative());
2115 assert!((-Single::INFINITY).is_negative());
2117 assert!(!Single::ZERO.is_negative());
2118 assert!((-Single::ZERO).is_negative());
2120 assert!(!Single::NAN.is_negative());
2121 assert!((-Single::NAN).is_negative());
2123 assert!(!Single::snan(None).is_negative());
2124 assert!((-Single::snan(None)).is_negative());
2129 let t = "0x1p+0".parse::<Single>().unwrap();
2130 assert!(t.is_normal());
2132 assert!(!Single::INFINITY.is_normal());
2133 assert!(!Single::ZERO.is_normal());
2134 assert!(!Single::NAN.is_normal());
2135 assert!(!Single::snan(None).is_normal());
2136 assert!(!"0x1p-149".parse::<Single>().unwrap().is_normal());
2141 let t = "0x1p+0".parse::<Single>().unwrap();
2142 assert!(t.is_finite());
2143 assert!(!Single::INFINITY.is_finite());
2144 assert!(Single::ZERO.is_finite());
2145 assert!(!Single::NAN.is_finite());
2146 assert!(!Single::snan(None).is_finite());
2147 assert!("0x1p-149".parse::<Single>().unwrap().is_finite());
2152 let t = "0x1p+0".parse::<Single>().unwrap();
2153 assert!(!t.is_infinite());
2154 assert!(Single::INFINITY.is_infinite());
2155 assert!(!Single::ZERO.is_infinite());
2156 assert!(!Single::NAN.is_infinite());
2157 assert!(!Single::snan(None).is_infinite());
2158 assert!(!"0x1p-149".parse::<Single>().unwrap().is_infinite());
2163 let t = "0x1p+0".parse::<Single>().unwrap();
2164 assert!(!t.is_nan());
2165 assert!(!Single::INFINITY.is_nan());
2166 assert!(!Single::ZERO.is_nan());
2167 assert!(Single::NAN.is_nan());
2168 assert!(Single::snan(None).is_nan());
2169 assert!(!"0x1p-149".parse::<Single>().unwrap().is_nan());
2173 fn is_finite_non_zero() {
2174 // Test positive/negative normal value.
2175 assert!("0x1p+0".parse::<Single>().unwrap().is_finite_non_zero());
2176 assert!("-0x1p+0".parse::<Single>().unwrap().is_finite_non_zero());
2178 // Test positive/negative denormal value.
2179 assert!("0x1p-149".parse::<Single>().unwrap().is_finite_non_zero());
2180 assert!("-0x1p-149".parse::<Single>().unwrap().is_finite_non_zero());
2182 // Test +/- Infinity.
2183 assert!(!Single::INFINITY.is_finite_non_zero());
2184 assert!(!(-Single::INFINITY).is_finite_non_zero());
2187 assert!(!Single::ZERO.is_finite_non_zero());
2188 assert!(!(-Single::ZERO).is_finite_non_zero());
2190 // Test +/- qNaN. +/- don't mean anything with qNaN but paranoia can't hurt in
2192 assert!(!Single::NAN.is_finite_non_zero());
2193 assert!(!(-Single::NAN).is_finite_non_zero());
2195 // Test +/- sNaN. +/- don't mean anything with sNaN but paranoia can't hurt in
2197 assert!(!Single::snan(None).is_finite_non_zero());
2198 assert!(!(-Single::snan(None)).is_finite_non_zero());
2203 // Test Special Cases against each other and normal values.
2206 // 1. Since we perform only default exception handling all operations with
2207 // signaling NaNs should have a result that is a quiet NaN. Currently they
2210 let p_inf = Single::INFINITY;
2211 let m_inf = -Single::INFINITY;
2212 let p_zero = Single::ZERO;
2213 let m_zero = -Single::ZERO;
2214 let qnan = Single::NAN;
2215 let p_normal_value = "0x1p+0".parse::<Single>().unwrap();
2216 let m_normal_value = "-0x1p+0".parse::<Single>().unwrap();
2217 let p_largest_value = Single::largest();
2218 let m_largest_value = -Single::largest();
2219 let p_smallest_value = Single::SMALLEST;
2220 let m_smallest_value = -Single::SMALLEST;
2221 let p_smallest_normalized = Single::smallest_normalized();
2222 let m_smallest_normalized = -Single::smallest_normalized();
2224 let overflow_status = Status::OVERFLOW | Status::INEXACT;
2226 let special_cases = [
2227 (p_inf, p_inf, "inf", Status::OK, Category::Infinity),
2228 (p_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN),
2229 (p_inf, p_zero, "inf", Status::OK, Category::Infinity),
2230 (p_inf, m_zero, "inf", Status::OK, Category::Infinity),
2231 (p_inf, qnan, "nan", Status::OK, Category::NaN),
2234 (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
2236 (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity),
2237 (p_inf, m_normal_value, "inf", Status::OK, Category::Infinity),
2268 p_smallest_normalized,
2275 m_smallest_normalized,
2280 (m_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN),
2281 (m_inf, m_inf, "-inf", Status::OK, Category::Infinity),
2282 (m_inf, p_zero, "-inf", Status::OK, Category::Infinity),
2283 (m_inf, m_zero, "-inf", Status::OK, Category::Infinity),
2284 (m_inf, qnan, "nan", Status::OK, Category::NaN),
2287 (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
2333 p_smallest_normalized,
2340 m_smallest_normalized,
2345 (p_zero, p_inf, "inf", Status::OK, Category::Infinity),
2346 (p_zero, m_inf, "-inf", Status::OK, Category::Infinity),
2347 (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero),
2348 (p_zero, m_zero, "0x0p+0", Status::OK, Category::Zero),
2349 (p_zero, qnan, "nan", Status::OK, Category::NaN),
2352 (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
2398 p_smallest_normalized,
2405 m_smallest_normalized,
2410 (m_zero, p_inf, "inf", Status::OK, Category::Infinity),
2411 (m_zero, m_inf, "-inf", Status::OK, Category::Infinity),
2412 (m_zero, p_zero, "0x0p+0", Status::OK, Category::Zero),
2413 (m_zero, m_zero, "-0x0p+0", Status::OK, Category::Zero),
2414 (m_zero, qnan, "nan", Status::OK, Category::NaN),
2417 (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
2463 p_smallest_normalized,
2470 m_smallest_normalized,
2475 (qnan, p_inf, "nan", Status::OK, Category::NaN),
2476 (qnan, m_inf, "nan", Status::OK, Category::NaN),
2477 (qnan, p_zero, "nan", Status::OK, Category::NaN),
2478 (qnan, m_zero, "nan", Status::OK, Category::NaN),
2479 (qnan, qnan, "nan", Status::OK, Category::NaN),
2482 (qnan, snan, "nan", Status::INVALID_OP, Category::NaN),
2484 (qnan, p_normal_value, "nan", Status::OK, Category::NaN),
2485 (qnan, m_normal_value, "nan", Status::OK, Category::NaN),
2486 (qnan, p_largest_value, "nan", Status::OK, Category::NaN),
2487 (qnan, m_largest_value, "nan", Status::OK, Category::NaN),
2488 (qnan, p_smallest_value, "nan", Status::OK, Category::NaN),
2489 (qnan, m_smallest_value, "nan", Status::OK, Category::NaN),
2492 p_smallest_normalized,
2499 m_smallest_normalized,
2506 (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN),
2507 (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN),
2508 (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN),
2509 (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN),
2510 (snan, qnan, "nan", Status::INVALID_OP, Category::NaN),
2511 (snan, snan, "nan", Status::INVALID_OP, Category::NaN),
2512 (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN),
2513 (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN),
2514 (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN),
2515 (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN),
2516 (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
2517 (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
2518 (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
2519 (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
2521 (p_normal_value, p_inf, "inf", Status::OK, Category::Infinity),
2543 (p_normal_value, qnan, "nan", Status::OK, Category::NaN),
2546 (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
2592 p_smallest_normalized,
2599 m_smallest_normalized,
2604 (m_normal_value, p_inf, "inf", Status::OK, Category::Infinity),
2626 (m_normal_value, qnan, "nan", Status::OK, Category::NaN),
2629 (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
2675 p_smallest_normalized,
2682 m_smallest_normalized,
2715 (p_largest_value, qnan, "nan", Status::OK, Category::NaN),
2718 (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
2764 p_smallest_normalized,
2771 m_smallest_normalized,
2804 (m_largest_value, qnan, "nan", Status::OK, Category::NaN),
2807 (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
2853 p_smallest_normalized,
2860 m_smallest_normalized,
2893 (p_smallest_value, qnan, "nan", Status::OK, Category::NaN),
2896 (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
2942 p_smallest_normalized,
2949 m_smallest_normalized,
2982 (m_smallest_value, qnan, "nan", Status::OK, Category::NaN),
2985 (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
3031 p_smallest_normalized,
3038 m_smallest_normalized,
3044 p_smallest_normalized,
3051 p_smallest_normalized,
3058 p_smallest_normalized,
3065 p_smallest_normalized,
3072 p_smallest_normalized,
3080 (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
3083 p_smallest_normalized,
3090 p_smallest_normalized,
3097 p_smallest_normalized,
3104 p_smallest_normalized,
3111 p_smallest_normalized,
3118 p_smallest_normalized,
3125 p_smallest_normalized,
3126 p_smallest_normalized,
3132 p_smallest_normalized,
3133 m_smallest_normalized,
3139 m_smallest_normalized,
3146 m_smallest_normalized,
3153 m_smallest_normalized,
3160 m_smallest_normalized,
3167 m_smallest_normalized,
3175 (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
3178 m_smallest_normalized,
3185 m_smallest_normalized,
3192 m_smallest_normalized,
3199 m_smallest_normalized,
3206 m_smallest_normalized,
3213 m_smallest_normalized,
3220 m_smallest_normalized,
3221 p_smallest_normalized,
3227 m_smallest_normalized,
3228 m_smallest_normalized,
3235 for &(x, y, e_result, e_status, e_category) in &special_cases[..] {
3237 let result = unpack!(status=, x + y);
3238 assert_eq!(status, e_status);
3239 assert_eq!(result.category(), e_category);
3240 assert!(result.bitwise_eq(e_result.parse::<Single>().unwrap()));
3246 // Test Special Cases against each other and normal values.
3249 // 1. Since we perform only default exception handling all operations with
3250 // signaling NaNs should have a result that is a quiet NaN. Currently they
3253 let p_inf = Single::INFINITY;
3254 let m_inf = -Single::INFINITY;
3255 let p_zero = Single::ZERO;
3256 let m_zero = -Single::ZERO;
3257 let qnan = Single::NAN;
3258 let p_normal_value = "0x1p+0".parse::<Single>().unwrap();
3259 let m_normal_value = "-0x1p+0".parse::<Single>().unwrap();
3260 let p_largest_value = Single::largest();
3261 let m_largest_value = -Single::largest();
3262 let p_smallest_value = Single::SMALLEST;
3263 let m_smallest_value = -Single::SMALLEST;
3264 let p_smallest_normalized = Single::smallest_normalized();
3265 let m_smallest_normalized = -Single::smallest_normalized();
3267 let overflow_status = Status::OVERFLOW | Status::INEXACT;
3269 let special_cases = [
3270 (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN),
3271 (p_inf, m_inf, "inf", Status::OK, Category::Infinity),
3272 (p_inf, p_zero, "inf", Status::OK, Category::Infinity),
3273 (p_inf, m_zero, "inf", Status::OK, Category::Infinity),
3274 (p_inf, qnan, "-nan", Status::OK, Category::NaN),
3277 (p_inf, snan, "-nan", Status::INVALID_OP, Category::NaN),
3279 (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity),
3280 (p_inf, m_normal_value, "inf", Status::OK, Category::Infinity),
3311 p_smallest_normalized,
3318 m_smallest_normalized,
3323 (m_inf, p_inf, "-inf", Status::OK, Category::Infinity),
3324 (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN),
3325 (m_inf, p_zero, "-inf", Status::OK, Category::Infinity),
3326 (m_inf, m_zero, "-inf", Status::OK, Category::Infinity),
3327 (m_inf, qnan, "-nan", Status::OK, Category::NaN),
3330 (m_inf, snan, "-nan", Status::INVALID_OP, Category::NaN),
3376 p_smallest_normalized,
3383 m_smallest_normalized,
3388 (p_zero, p_inf, "-inf", Status::OK, Category::Infinity),
3389 (p_zero, m_inf, "inf", Status::OK, Category::Infinity),
3390 (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero),
3391 (p_zero, m_zero, "0x0p+0", Status::OK, Category::Zero),
3392 (p_zero, qnan, "-nan", Status::OK, Category::NaN),
3395 (p_zero, snan, "-nan", Status::INVALID_OP, Category::NaN),
3441 p_smallest_normalized,
3448 m_smallest_normalized,
3453 (m_zero, p_inf, "-inf", Status::OK, Category::Infinity),
3454 (m_zero, m_inf, "inf", Status::OK, Category::Infinity),
3455 (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero),
3456 (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero),
3457 (m_zero, qnan, "-nan", Status::OK, Category::NaN),
3460 (m_zero, snan, "-nan", Status::INVALID_OP, Category::NaN),
3506 p_smallest_normalized,
3513 m_smallest_normalized,
3518 (qnan, p_inf, "nan", Status::OK, Category::NaN),
3519 (qnan, m_inf, "nan", Status::OK, Category::NaN),
3520 (qnan, p_zero, "nan", Status::OK, Category::NaN),
3521 (qnan, m_zero, "nan", Status::OK, Category::NaN),
3522 (qnan, qnan, "nan", Status::OK, Category::NaN),
3525 (qnan, snan, "nan", Status::INVALID_OP, Category::NaN),
3527 (qnan, p_normal_value, "nan", Status::OK, Category::NaN),
3528 (qnan, m_normal_value, "nan", Status::OK, Category::NaN),
3529 (qnan, p_largest_value, "nan", Status::OK, Category::NaN),
3530 (qnan, m_largest_value, "nan", Status::OK, Category::NaN),
3531 (qnan, p_smallest_value, "nan", Status::OK, Category::NaN),
3532 (qnan, m_smallest_value, "nan", Status::OK, Category::NaN),
3535 p_smallest_normalized,
3542 m_smallest_normalized,
3549 (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN),
3550 (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN),
3551 (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN),
3552 (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN),
3553 (snan, qnan, "nan", Status::INVALID_OP, Category::NaN),
3554 (snan, snan, "nan", Status::INVALID_OP, Category::NaN),
3555 (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN),
3556 (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN),
3557 (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN),
3558 (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN),
3559 (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
3560 (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
3561 (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
3562 (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
3571 (p_normal_value, m_inf, "inf", Status::OK, Category::Infinity),
3586 (p_normal_value, qnan, "-nan", Status::OK, Category::NaN),
3589 (p_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
3635 p_smallest_normalized,
3642 m_smallest_normalized,
3654 (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity),
3669 (m_normal_value, qnan, "-nan", Status::OK, Category::NaN),
3672 (m_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
3718 p_smallest_normalized,
3725 m_smallest_normalized,
3758 (p_largest_value, qnan, "-nan", Status::OK, Category::NaN),
3761 (p_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
3807 p_smallest_normalized,
3814 m_smallest_normalized,
3847 (m_largest_value, qnan, "-nan", Status::OK, Category::NaN),
3850 (m_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
3896 p_smallest_normalized,
3903 m_smallest_normalized,
3936 (p_smallest_value, qnan, "-nan", Status::OK, Category::NaN),
3939 (p_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
3985 p_smallest_normalized,
3992 m_smallest_normalized,
4025 (m_smallest_value, qnan, "-nan", Status::OK, Category::NaN),
4028 (m_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN),
4074 p_smallest_normalized,
4081 m_smallest_normalized,
4087 p_smallest_normalized,
4094 p_smallest_normalized,
4101 p_smallest_normalized,
4108 p_smallest_normalized,
4115 p_smallest_normalized,
4123 (p_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN),
4126 p_smallest_normalized,
4133 p_smallest_normalized,
4140 p_smallest_normalized,
4147 p_smallest_normalized,
4154 p_smallest_normalized,
4161 p_smallest_normalized,
4168 p_smallest_normalized,
4169 p_smallest_normalized,
4175 p_smallest_normalized,
4176 m_smallest_normalized,
4182 m_smallest_normalized,
4189 m_smallest_normalized,
4196 m_smallest_normalized,
4203 m_smallest_normalized,
4210 m_smallest_normalized,
4218 (m_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN),
4221 m_smallest_normalized,
4228 m_smallest_normalized,
4235 m_smallest_normalized,
4242 m_smallest_normalized,
4249 m_smallest_normalized,
4256 m_smallest_normalized,
4263 m_smallest_normalized,
4264 p_smallest_normalized,
4270 m_smallest_normalized,
4271 m_smallest_normalized,
4278 for &(x, y, e_result, e_status, e_category) in &special_cases[..] {
4280 let result = unpack!(status=, x - y);
4281 assert_eq!(status, e_status);
4282 assert_eq!(result.category(), e_category);
4283 assert!(result.bitwise_eq(e_result.parse::<Single>().unwrap()));
4289 // Test Special Cases against each other and normal values.
4292 // 1. Since we perform only default exception handling all operations with
4293 // signaling NaNs should have a result that is a quiet NaN. Currently they
4296 let p_inf = Single::INFINITY;
4297 let m_inf = -Single::INFINITY;
4298 let p_zero = Single::ZERO;
4299 let m_zero = -Single::ZERO;
4300 let qnan = Single::NAN;
4301 let p_normal_value = "0x1p+0".parse::<Single>().unwrap();
4302 let m_normal_value = "-0x1p+0".parse::<Single>().unwrap();
4303 let p_largest_value = Single::largest();
4304 let m_largest_value = -Single::largest();
4305 let p_smallest_value = Single::SMALLEST;
4306 let m_smallest_value = -Single::SMALLEST;
4307 let p_smallest_normalized = Single::smallest_normalized();
4308 let m_smallest_normalized = -Single::smallest_normalized();
4310 let overflow_status = Status::OVERFLOW | Status::INEXACT;
4311 let underflow_status = Status::UNDERFLOW | Status::INEXACT;
4313 let special_cases = [
4314 (p_inf, p_inf, "inf", Status::OK, Category::Infinity),
4315 (p_inf, m_inf, "-inf", Status::OK, Category::Infinity),
4316 (p_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN),
4317 (p_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN),
4318 (p_inf, qnan, "nan", Status::OK, Category::NaN),
4321 (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
4323 (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity),
4361 p_smallest_normalized,
4368 m_smallest_normalized,
4373 (m_inf, p_inf, "-inf", Status::OK, Category::Infinity),
4374 (m_inf, m_inf, "inf", Status::OK, Category::Infinity),
4375 (m_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN),
4376 (m_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN),
4377 (m_inf, qnan, "nan", Status::OK, Category::NaN),
4380 (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
4389 (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity),
4420 p_smallest_normalized,
4427 m_smallest_normalized,
4432 (p_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN),
4433 (p_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN),
4434 (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero),
4435 (p_zero, m_zero, "-0x0p+0", Status::OK, Category::Zero),
4436 (p_zero, qnan, "nan", Status::OK, Category::NaN),
4439 (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
4441 (p_zero, p_normal_value, "0x0p+0", Status::OK, Category::Zero),
4479 p_smallest_normalized,
4486 m_smallest_normalized,
4491 (m_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN),
4492 (m_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN),
4493 (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero),
4494 (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero),
4495 (m_zero, qnan, "nan", Status::OK, Category::NaN),
4498 (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
4507 (m_zero, m_normal_value, "0x0p+0", Status::OK, Category::Zero),
4538 p_smallest_normalized,
4545 m_smallest_normalized,
4550 (qnan, p_inf, "nan", Status::OK, Category::NaN),
4551 (qnan, m_inf, "nan", Status::OK, Category::NaN),
4552 (qnan, p_zero, "nan", Status::OK, Category::NaN),
4553 (qnan, m_zero, "nan", Status::OK, Category::NaN),
4554 (qnan, qnan, "nan", Status::OK, Category::NaN),
4557 (qnan, snan, "nan", Status::INVALID_OP, Category::NaN),
4559 (qnan, p_normal_value, "nan", Status::OK, Category::NaN),
4560 (qnan, m_normal_value, "nan", Status::OK, Category::NaN),
4561 (qnan, p_largest_value, "nan", Status::OK, Category::NaN),
4562 (qnan, m_largest_value, "nan", Status::OK, Category::NaN),
4563 (qnan, p_smallest_value, "nan", Status::OK, Category::NaN),
4564 (qnan, m_smallest_value, "nan", Status::OK, Category::NaN),
4567 p_smallest_normalized,
4574 m_smallest_normalized,
4581 (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN),
4582 (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN),
4583 (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN),
4584 (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN),
4585 (snan, qnan, "nan", Status::INVALID_OP, Category::NaN),
4586 (snan, snan, "nan", Status::INVALID_OP, Category::NaN),
4587 (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN),
4588 (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN),
4589 (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN),
4590 (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN),
4591 (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
4592 (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
4593 (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
4594 (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
4596 (p_normal_value, p_inf, "inf", Status::OK, Category::Infinity),
4604 (p_normal_value, p_zero, "0x0p+0", Status::OK, Category::Zero),
4612 (p_normal_value, qnan, "nan", Status::OK, Category::NaN),
4615 (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
4661 p_smallest_normalized,
4668 m_smallest_normalized,
4680 (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity),
4688 (m_normal_value, m_zero, "0x0p+0", Status::OK, Category::Zero),
4689 (m_normal_value, qnan, "nan", Status::OK, Category::NaN),
4692 (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
4738 p_smallest_normalized,
4745 m_smallest_normalized,
4778 (p_largest_value, qnan, "nan", Status::OK, Category::NaN),
4781 (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
4827 p_smallest_normalized,
4834 m_smallest_normalized,
4867 (m_largest_value, qnan, "nan", Status::OK, Category::NaN),
4870 (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
4916 p_smallest_normalized,
4923 m_smallest_normalized,
4956 (p_smallest_value, qnan, "nan", Status::OK, Category::NaN),
4959 (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5005 p_smallest_normalized,
5012 m_smallest_normalized,
5045 (m_smallest_value, qnan, "nan", Status::OK, Category::NaN),
5048 (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5094 p_smallest_normalized,
5101 m_smallest_normalized,
5107 p_smallest_normalized,
5114 p_smallest_normalized,
5121 p_smallest_normalized,
5128 p_smallest_normalized,
5135 p_smallest_normalized,
5143 (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
5146 p_smallest_normalized,
5153 p_smallest_normalized,
5160 p_smallest_normalized,
5167 p_smallest_normalized,
5174 p_smallest_normalized,
5181 p_smallest_normalized,
5188 p_smallest_normalized,
5189 p_smallest_normalized,
5195 p_smallest_normalized,
5196 m_smallest_normalized,
5202 m_smallest_normalized,
5209 m_smallest_normalized,
5216 m_smallest_normalized,
5223 m_smallest_normalized,
5230 m_smallest_normalized,
5238 (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
5241 m_smallest_normalized,
5248 m_smallest_normalized,
5255 m_smallest_normalized,
5262 m_smallest_normalized,
5269 m_smallest_normalized,
5276 m_smallest_normalized,
5283 m_smallest_normalized,
5284 p_smallest_normalized,
5290 m_smallest_normalized,
5291 m_smallest_normalized,
5298 for &(x, y, e_result, e_status, e_category) in &special_cases[..] {
5300 let result = unpack!(status=, x * y);
5301 assert_eq!(status, e_status);
5302 assert_eq!(result.category(), e_category);
5303 assert!(result.bitwise_eq(e_result.parse::<Single>().unwrap()));
5309 // Test Special Cases against each other and normal values.
5312 // 1. Since we perform only default exception handling all operations with
5313 // signaling NaNs should have a result that is a quiet NaN. Currently they
5316 let p_inf = Single::INFINITY;
5317 let m_inf = -Single::INFINITY;
5318 let p_zero = Single::ZERO;
5319 let m_zero = -Single::ZERO;
5320 let qnan = Single::NAN;
5321 let p_normal_value = "0x1p+0".parse::<Single>().unwrap();
5322 let m_normal_value = "-0x1p+0".parse::<Single>().unwrap();
5323 let p_largest_value = Single::largest();
5324 let m_largest_value = -Single::largest();
5325 let p_smallest_value = Single::SMALLEST;
5326 let m_smallest_value = -Single::SMALLEST;
5327 let p_smallest_normalized = Single::smallest_normalized();
5328 let m_smallest_normalized = -Single::smallest_normalized();
5330 let overflow_status = Status::OVERFLOW | Status::INEXACT;
5331 let underflow_status = Status::UNDERFLOW | Status::INEXACT;
5333 let special_cases = [
5334 (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN),
5335 (p_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN),
5336 (p_inf, p_zero, "inf", Status::OK, Category::Infinity),
5337 (p_inf, m_zero, "-inf", Status::OK, Category::Infinity),
5338 (p_inf, qnan, "nan", Status::OK, Category::NaN),
5341 (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
5343 (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity),
5381 p_smallest_normalized,
5388 m_smallest_normalized,
5393 (m_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN),
5394 (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN),
5395 (m_inf, p_zero, "-inf", Status::OK, Category::Infinity),
5396 (m_inf, m_zero, "inf", Status::OK, Category::Infinity),
5397 (m_inf, qnan, "nan", Status::OK, Category::NaN),
5400 (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN),
5409 (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity),
5440 p_smallest_normalized,
5447 m_smallest_normalized,
5452 (p_zero, p_inf, "0x0p+0", Status::OK, Category::Zero),
5453 (p_zero, m_inf, "-0x0p+0", Status::OK, Category::Zero),
5454 (p_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN),
5455 (p_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN),
5456 (p_zero, qnan, "nan", Status::OK, Category::NaN),
5459 (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
5461 (p_zero, p_normal_value, "0x0p+0", Status::OK, Category::Zero),
5499 p_smallest_normalized,
5506 m_smallest_normalized,
5511 (m_zero, p_inf, "-0x0p+0", Status::OK, Category::Zero),
5512 (m_zero, m_inf, "0x0p+0", Status::OK, Category::Zero),
5513 (m_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN),
5514 (m_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN),
5515 (m_zero, qnan, "nan", Status::OK, Category::NaN),
5518 (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN),
5527 (m_zero, m_normal_value, "0x0p+0", Status::OK, Category::Zero),
5558 p_smallest_normalized,
5565 m_smallest_normalized,
5570 (qnan, p_inf, "nan", Status::OK, Category::NaN),
5571 (qnan, m_inf, "nan", Status::OK, Category::NaN),
5572 (qnan, p_zero, "nan", Status::OK, Category::NaN),
5573 (qnan, m_zero, "nan", Status::OK, Category::NaN),
5574 (qnan, qnan, "nan", Status::OK, Category::NaN),
5577 (qnan, snan, "nan", Status::INVALID_OP, Category::NaN),
5579 (qnan, p_normal_value, "nan", Status::OK, Category::NaN),
5580 (qnan, m_normal_value, "nan", Status::OK, Category::NaN),
5581 (qnan, p_largest_value, "nan", Status::OK, Category::NaN),
5582 (qnan, m_largest_value, "nan", Status::OK, Category::NaN),
5583 (qnan, p_smallest_value, "nan", Status::OK, Category::NaN),
5584 (qnan, m_smallest_value, "nan", Status::OK, Category::NaN),
5587 p_smallest_normalized,
5594 m_smallest_normalized,
5601 (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN),
5602 (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN),
5603 (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN),
5604 (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN),
5605 (snan, qnan, "nan", Status::INVALID_OP, Category::NaN),
5606 (snan, snan, "nan", Status::INVALID_OP, Category::NaN),
5607 (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN),
5608 (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN),
5609 (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN),
5610 (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN),
5611 (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
5612 (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN),
5613 (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
5614 (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN),
5616 (p_normal_value, p_inf, "0x0p+0", Status::OK, Category::Zero),
5617 (p_normal_value, m_inf, "-0x0p+0", Status::OK, Category::Zero),
5622 Status::DIV_BY_ZERO,
5629 Status::DIV_BY_ZERO,
5632 (p_normal_value, qnan, "nan", Status::OK, Category::NaN),
5635 (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5681 p_smallest_normalized,
5688 m_smallest_normalized,
5693 (m_normal_value, p_inf, "-0x0p+0", Status::OK, Category::Zero),
5694 (m_normal_value, m_inf, "0x0p+0", Status::OK, Category::Zero),
5699 Status::DIV_BY_ZERO,
5706 Status::DIV_BY_ZERO,
5709 (m_normal_value, qnan, "nan", Status::OK, Category::NaN),
5712 (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5758 p_smallest_normalized,
5765 m_smallest_normalized,
5770 (p_largest_value, p_inf, "0x0p+0", Status::OK, Category::Zero),
5782 Status::DIV_BY_ZERO,
5789 Status::DIV_BY_ZERO,
5792 (p_largest_value, qnan, "nan", Status::OK, Category::NaN),
5795 (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5841 p_smallest_normalized,
5848 m_smallest_normalized,
5860 (m_largest_value, m_inf, "0x0p+0", Status::OK, Category::Zero),
5865 Status::DIV_BY_ZERO,
5872 Status::DIV_BY_ZERO,
5875 (m_largest_value, qnan, "nan", Status::OK, Category::NaN),
5878 (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
5924 p_smallest_normalized,
5931 m_smallest_normalized,
5954 Status::DIV_BY_ZERO,
5961 Status::DIV_BY_ZERO,
5964 (p_smallest_value, qnan, "nan", Status::OK, Category::NaN),
5967 (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
6013 p_smallest_normalized,
6020 m_smallest_normalized,
6043 Status::DIV_BY_ZERO,
6050 Status::DIV_BY_ZERO,
6053 (m_smallest_value, qnan, "nan", Status::OK, Category::NaN),
6056 (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN),
6102 p_smallest_normalized,
6109 m_smallest_normalized,
6115 p_smallest_normalized,
6122 p_smallest_normalized,
6129 p_smallest_normalized,
6132 Status::DIV_BY_ZERO,
6136 p_smallest_normalized,
6139 Status::DIV_BY_ZERO,
6143 p_smallest_normalized,
6151 (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
6154 p_smallest_normalized,
6161 p_smallest_normalized,
6168 p_smallest_normalized,
6175 p_smallest_normalized,
6182 p_smallest_normalized,
6189 p_smallest_normalized,
6196 p_smallest_normalized,
6197 p_smallest_normalized,
6203 p_smallest_normalized,
6204 m_smallest_normalized,
6210 m_smallest_normalized,
6217 m_smallest_normalized,
6224 m_smallest_normalized,
6227 Status::DIV_BY_ZERO,
6231 m_smallest_normalized,
6234 Status::DIV_BY_ZERO,
6238 m_smallest_normalized,
6246 (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN),
6249 m_smallest_normalized,
6256 m_smallest_normalized,
6263 m_smallest_normalized,
6270 m_smallest_normalized,
6277 m_smallest_normalized,
6284 m_smallest_normalized,
6291 m_smallest_normalized,
6292 p_smallest_normalized,
6298 m_smallest_normalized,
6299 m_smallest_normalized,
6306 for &(x, y, e_result, e_status, e_category) in &special_cases[..] {
6308 let result = unpack!(status=, x / y);
6309 assert_eq!(status, e_status);
6310 assert_eq!(result.category(), e_category);
6311 assert!(result.bitwise_eq(e_result.parse::<Single>().unwrap()));
6316 fn operator_overloads() {
6317 // This is mostly testing that these operator overloads compile.
6318 let one = "0x1p+0".parse::<Single>().unwrap();
6319 let two = "0x2p+0".parse::<Single>().unwrap();
6320 assert!(two.bitwise_eq((one + one).value));
6321 assert!(one.bitwise_eq((two - one).value));
6322 assert!(two.bitwise_eq((one * two).value));
6323 assert!(one.bitwise_eq((two / two).value));
6328 let p_inf = Single::INFINITY;
6329 let m_inf = -Single::INFINITY;
6330 let p_zero = Single::ZERO;
6331 let m_zero = -Single::ZERO;
6332 let p_qnan = Single::NAN;
6333 let m_qnan = -Single::NAN;
6334 let p_snan = Single::snan(None);
6335 let m_snan = -Single::snan(None);
6336 let p_normal_value = "0x1p+0".parse::<Single>().unwrap();
6337 let m_normal_value = "-0x1p+0".parse::<Single>().unwrap();
6338 let p_largest_value = Single::largest();
6339 let m_largest_value = -Single::largest();
6340 let p_smallest_value = Single::SMALLEST;
6341 let m_smallest_value = -Single::SMALLEST;
6342 let p_smallest_normalized = Single::smallest_normalized();
6343 let m_smallest_normalized = -Single::smallest_normalized();
6345 assert!(p_inf.bitwise_eq(p_inf.abs()));
6346 assert!(p_inf.bitwise_eq(m_inf.abs()));
6347 assert!(p_zero.bitwise_eq(p_zero.abs()));
6348 assert!(p_zero.bitwise_eq(m_zero.abs()));
6349 assert!(p_qnan.bitwise_eq(p_qnan.abs()));
6350 assert!(p_qnan.bitwise_eq(m_qnan.abs()));
6351 assert!(p_snan.bitwise_eq(p_snan.abs()));
6352 assert!(p_snan.bitwise_eq(m_snan.abs()));
6353 assert!(p_normal_value.bitwise_eq(p_normal_value.abs()));
6354 assert!(p_normal_value.bitwise_eq(m_normal_value.abs()));
6355 assert!(p_largest_value.bitwise_eq(p_largest_value.abs()));
6356 assert!(p_largest_value.bitwise_eq(m_largest_value.abs()));
6357 assert!(p_smallest_value.bitwise_eq(p_smallest_value.abs()));
6358 assert!(p_smallest_value.bitwise_eq(m_smallest_value.abs()));
6359 assert!(p_smallest_normalized.bitwise_eq(
6360 p_smallest_normalized.abs(),
6362 assert!(p_smallest_normalized.bitwise_eq(
6363 m_smallest_normalized.abs(),
6369 let one = "1.0".parse::<Single>().unwrap();
6370 let neg_one = "-1.0".parse::<Single>().unwrap();
6371 let zero = Single::ZERO;
6372 let neg_zero = -Single::ZERO;
6373 let inf = Single::INFINITY;
6374 let neg_inf = -Single::INFINITY;
6375 let qnan = Single::NAN;
6376 let neg_qnan = -Single::NAN;
6378 assert!(neg_one.bitwise_eq(-one));
6379 assert!(one.bitwise_eq(-neg_one));
6380 assert!(neg_zero.bitwise_eq(-zero));
6381 assert!(zero.bitwise_eq(-neg_zero));
6382 assert!(neg_inf.bitwise_eq(-inf));
6383 assert!(inf.bitwise_eq(-neg_inf));
6384 assert!(neg_inf.bitwise_eq(-inf));
6385 assert!(inf.bitwise_eq(-neg_inf));
6386 assert!(neg_qnan.bitwise_eq(-qnan));
6387 assert!(qnan.bitwise_eq(-neg_qnan));
6392 assert_eq!(-1074, Double::SMALLEST.ilogb());
6393 assert_eq!(-1074, (-Double::SMALLEST).ilogb());
6396 "0x1.ffffffffffffep-1024".parse::<Double>().unwrap().ilogb()
6400 "0x1.ffffffffffffep-1023".parse::<Double>().unwrap().ilogb()
6404 "-0x1.ffffffffffffep-1023"
6409 assert_eq!(-51, "0x1p-51".parse::<Double>().unwrap().ilogb());
6412 "0x1.c60f120d9f87cp-1023".parse::<Double>().unwrap().ilogb()
6414 assert_eq!(-2, "0x0.ffffp-1".parse::<Double>().unwrap().ilogb());
6415 assert_eq!(-1023, "0x1.fffep-1023".parse::<Double>().unwrap().ilogb());
6416 assert_eq!(1023, Double::largest().ilogb());
6417 assert_eq!(1023, (-Double::largest()).ilogb());
6420 assert_eq!(0, "0x1p+0".parse::<Single>().unwrap().ilogb());
6421 assert_eq!(0, "-0x1p+0".parse::<Single>().unwrap().ilogb());
6422 assert_eq!(42, "0x1p+42".parse::<Single>().unwrap().ilogb());
6423 assert_eq!(-42, "0x1p-42".parse::<Single>().unwrap().ilogb());
6425 assert_eq!(IEK_INF, Single::INFINITY.ilogb());
6426 assert_eq!(IEK_INF, (-Single::INFINITY).ilogb());
6427 assert_eq!(IEK_ZERO, Single::ZERO.ilogb());
6428 assert_eq!(IEK_ZERO, (-Single::ZERO).ilogb());
6429 assert_eq!(IEK_NAN, Single::NAN.ilogb());
6430 assert_eq!(IEK_NAN, Single::snan(None).ilogb());
6432 assert_eq!(127, Single::largest().ilogb());
6433 assert_eq!(127, (-Single::largest()).ilogb());
6435 assert_eq!(-149, Single::SMALLEST.ilogb());
6436 assert_eq!(-149, (-Single::SMALLEST).ilogb());
6437 assert_eq!(-126, Single::smallest_normalized().ilogb());
6438 assert_eq!(-126, (-Single::smallest_normalized()).ilogb());
6443 assert!("0x1p+0".parse::<Single>().unwrap().bitwise_eq(
6444 "0x1p+0".parse::<Single>().unwrap().scalbn(0),
6446 assert!("0x1p+42".parse::<Single>().unwrap().bitwise_eq(
6447 "0x1p+0".parse::<Single>().unwrap().scalbn(42),
6449 assert!("0x1p-42".parse::<Single>().unwrap().bitwise_eq(
6450 "0x1p+0".parse::<Single>().unwrap().scalbn(-42),
6453 let p_inf = Single::INFINITY;
6454 let m_inf = -Single::INFINITY;
6455 let p_zero = Single::ZERO;
6456 let m_zero = -Single::ZERO;
6457 let p_qnan = Single::NAN;
6458 let m_qnan = -Single::NAN;
6459 let snan = Single::snan(None);
6461 assert!(p_inf.bitwise_eq(p_inf.scalbn(0)));
6462 assert!(m_inf.bitwise_eq(m_inf.scalbn(0)));
6463 assert!(p_zero.bitwise_eq(p_zero.scalbn(0)));
6464 assert!(m_zero.bitwise_eq(m_zero.scalbn(0)));
6465 assert!(p_qnan.bitwise_eq(p_qnan.scalbn(0)));
6466 assert!(m_qnan.bitwise_eq(m_qnan.scalbn(0)));
6467 assert!(!snan.scalbn(0).is_signaling());
6469 let scalbn_snan = snan.scalbn(1);
6470 assert!(scalbn_snan.is_nan() && !scalbn_snan.is_signaling());
6472 // Make sure highest bit of payload is preserved.
6473 let payload = (1 << 50) | (1 << 49) | (1234 << 32) | 1;
6475 let snan_with_payload = Double::snan(Some(payload));
6476 let quiet_payload = snan_with_payload.scalbn(1);
6477 assert!(quiet_payload.is_nan() && !quiet_payload.is_signaling());
6478 assert_eq!(payload, quiet_payload.to_bits() & ((1 << 51) - 1));
6480 assert!(p_inf.bitwise_eq(
6481 "0x1p+0".parse::<Single>().unwrap().scalbn(128),
6483 assert!(m_inf.bitwise_eq(
6484 "-0x1p+0".parse::<Single>().unwrap().scalbn(128),
6486 assert!(p_inf.bitwise_eq(
6487 "0x1p+127".parse::<Single>().unwrap().scalbn(1),
6489 assert!(p_zero.bitwise_eq(
6490 "0x1p-127".parse::<Single>().unwrap().scalbn(-127),
6492 assert!(m_zero.bitwise_eq(
6493 "-0x1p-127".parse::<Single>().unwrap().scalbn(-127),
6495 assert!("-0x1p-149".parse::<Single>().unwrap().bitwise_eq(
6496 "-0x1p-127".parse::<Single>().unwrap().scalbn(-22),
6498 assert!(p_zero.bitwise_eq(
6499 "0x1p-126".parse::<Single>().unwrap().scalbn(-24),
6503 let smallest_f64 = Double::SMALLEST;
6504 let neg_smallest_f64 = -Double::SMALLEST;
6506 let largest_f64 = Double::largest();
6507 let neg_largest_f64 = -Double::largest();
6509 let largest_denormal_f64 = "0x1.ffffffffffffep-1023".parse::<Double>().unwrap();
6510 let neg_largest_denormal_f64 = "-0x1.ffffffffffffep-1023".parse::<Double>().unwrap();
6513 assert!(smallest_f64.bitwise_eq(
6514 "0x1p-1074".parse::<Double>().unwrap().scalbn(0),
6516 assert!(neg_smallest_f64.bitwise_eq(
6517 "-0x1p-1074".parse::<Double>().unwrap().scalbn(0),
6520 assert!("0x1p+1023".parse::<Double>().unwrap().bitwise_eq(
6521 smallest_f64.scalbn(
6526 assert!(smallest_f64.scalbn(-2097).is_pos_zero());
6527 assert!(smallest_f64.scalbn(-2098).is_pos_zero());
6528 assert!(smallest_f64.scalbn(-2099).is_pos_zero());
6529 assert!("0x1p+1022".parse::<Double>().unwrap().bitwise_eq(
6530 smallest_f64.scalbn(
6534 assert!("0x1p+1023".parse::<Double>().unwrap().bitwise_eq(
6535 smallest_f64.scalbn(
6539 assert!(smallest_f64.scalbn(2098).is_infinite());
6540 assert!(smallest_f64.scalbn(2099).is_infinite());
6542 // Test for integer overflows when adding to exponent.
6543 assert!(smallest_f64.scalbn(-ExpInt::max_value()).is_pos_zero());
6544 assert!(largest_f64.scalbn(ExpInt::max_value()).is_infinite());
6546 assert!(largest_denormal_f64.bitwise_eq(
6547 largest_denormal_f64.scalbn(0),
6549 assert!(neg_largest_denormal_f64.bitwise_eq(
6550 neg_largest_denormal_f64.scalbn(0),
6554 "0x1.ffffffffffffep-1022"
6557 .bitwise_eq(largest_denormal_f64.scalbn(1))
6560 "-0x1.ffffffffffffep-1021"
6563 .bitwise_eq(neg_largest_denormal_f64.scalbn(2))
6567 "0x1.ffffffffffffep+1"
6570 .bitwise_eq(largest_denormal_f64.scalbn(1024))
6572 assert!(largest_denormal_f64.scalbn(-1023).is_pos_zero());
6573 assert!(largest_denormal_f64.scalbn(-1024).is_pos_zero());
6574 assert!(largest_denormal_f64.scalbn(-2048).is_pos_zero());
6575 assert!(largest_denormal_f64.scalbn(2047).is_infinite());
6576 assert!(largest_denormal_f64.scalbn(2098).is_infinite());
6577 assert!(largest_denormal_f64.scalbn(2099).is_infinite());
6580 "0x1.ffffffffffffep-2"
6583 .bitwise_eq(largest_denormal_f64.scalbn(1021))
6586 "0x1.ffffffffffffep-1"
6589 .bitwise_eq(largest_denormal_f64.scalbn(1022))
6592 "0x1.ffffffffffffep+0"
6595 .bitwise_eq(largest_denormal_f64.scalbn(1023))
6598 "0x1.ffffffffffffep+1023"
6601 .bitwise_eq(largest_denormal_f64.scalbn(2046))
6603 assert!("0x1p+974".parse::<Double>().unwrap().bitwise_eq(
6604 smallest_f64.scalbn(
6609 let random_denormal_f64 = "0x1.c60f120d9f87cp+51".parse::<Double>().unwrap();
6611 "0x1.c60f120d9f87cp-972"
6614 .bitwise_eq(random_denormal_f64.scalbn(-1023))
6617 "0x1.c60f120d9f87cp-1"
6620 .bitwise_eq(random_denormal_f64.scalbn(-52))
6623 "0x1.c60f120d9f87cp-2"
6626 .bitwise_eq(random_denormal_f64.scalbn(-53))
6629 "0x1.c60f120d9f87cp+0"
6632 .bitwise_eq(random_denormal_f64.scalbn(-51))
6635 assert!(random_denormal_f64.scalbn(-2097).is_pos_zero());
6636 assert!(random_denormal_f64.scalbn(-2090).is_pos_zero());
6639 assert!("-0x1p-1073".parse::<Double>().unwrap().bitwise_eq(
6640 neg_largest_f64.scalbn(-2097),
6643 assert!("-0x1p-1024".parse::<Double>().unwrap().bitwise_eq(
6644 neg_largest_f64.scalbn(-2048),
6647 assert!("0x1p-1073".parse::<Double>().unwrap().bitwise_eq(
6653 assert!("0x1p-1074".parse::<Double>().unwrap().bitwise_eq(
6658 assert!("-0x1p-1074".parse::<Double>().unwrap().bitwise_eq(
6659 neg_largest_f64.scalbn(-2098),
6661 assert!(neg_largest_f64.scalbn(-2099).is_neg_zero());
6662 assert!(largest_f64.scalbn(1).is_infinite());
6665 assert!("0x1p+0".parse::<Double>().unwrap().bitwise_eq(
6666 "0x1p+52".parse::<Double>().unwrap().scalbn(-52),
6669 assert!("0x1p-103".parse::<Double>().unwrap().bitwise_eq(
6670 "0x1p-51".parse::<Double>().unwrap().scalbn(-52),
6676 let p_zero = Double::ZERO;
6677 let m_zero = -Double::ZERO;
6678 let one = Double::from_f64(1.0);
6679 let m_one = Double::from_f64(-1.0);
6681 let largest_denormal = "0x1.ffffffffffffep-1023".parse::<Double>().unwrap();
6682 let neg_largest_denormal = "-0x1.ffffffffffffep-1023".parse::<Double>().unwrap();
6684 let smallest = Double::SMALLEST;
6685 let neg_smallest = -Double::SMALLEST;
6687 let largest = Double::largest();
6688 let neg_largest = -Double::largest();
6690 let p_inf = Double::INFINITY;
6691 let m_inf = -Double::INFINITY;
6693 let p_qnan = Double::NAN;
6694 let m_qnan = -Double::NAN;
6695 let snan = Double::snan(None);
6697 // Make sure highest bit of payload is preserved.
6698 let payload = (1 << 50) | (1 << 49) | (1234 << 32) | 1;
6700 let snan_with_payload = Double::snan(Some(payload));
6704 let frac = p_zero.frexp(&mut exp);
6706 assert!(frac.is_pos_zero());
6708 let frac = m_zero.frexp(&mut exp);
6710 assert!(frac.is_neg_zero());
6713 let frac = one.frexp(&mut exp);
6715 assert!("0x1p-1".parse::<Double>().unwrap().bitwise_eq(frac));
6717 let frac = m_one.frexp(&mut exp);
6719 assert!("-0x1p-1".parse::<Double>().unwrap().bitwise_eq(frac));
6721 let frac = largest_denormal.frexp(&mut exp);
6722 assert_eq!(-1022, exp);
6724 "0x1.ffffffffffffep-1"
6730 let frac = neg_largest_denormal.frexp(&mut exp);
6731 assert_eq!(-1022, exp);
6733 "-0x1.ffffffffffffep-1"
6740 let frac = smallest.frexp(&mut exp);
6741 assert_eq!(-1073, exp);
6742 assert!("0x1p-1".parse::<Double>().unwrap().bitwise_eq(frac));
6744 let frac = neg_smallest.frexp(&mut exp);
6745 assert_eq!(-1073, exp);
6746 assert!("-0x1p-1".parse::<Double>().unwrap().bitwise_eq(frac));
6749 let frac = largest.frexp(&mut exp);
6750 assert_eq!(1024, exp);
6752 "0x1.fffffffffffffp-1"
6758 let frac = neg_largest.frexp(&mut exp);
6759 assert_eq!(1024, exp);
6761 "-0x1.fffffffffffffp-1"
6768 let frac = p_inf.frexp(&mut exp);
6769 assert_eq!(IEK_INF, exp);
6770 assert!(frac.is_infinite() && !frac.is_negative());
6772 let frac = m_inf.frexp(&mut exp);
6773 assert_eq!(IEK_INF, exp);
6774 assert!(frac.is_infinite() && frac.is_negative());
6776 let frac = p_qnan.frexp(&mut exp);
6777 assert_eq!(IEK_NAN, exp);
6778 assert!(frac.is_nan());
6780 let frac = m_qnan.frexp(&mut exp);
6781 assert_eq!(IEK_NAN, exp);
6782 assert!(frac.is_nan());
6784 let frac = snan.frexp(&mut exp);
6785 assert_eq!(IEK_NAN, exp);
6786 assert!(frac.is_nan() && !frac.is_signaling());
6788 let frac = snan_with_payload.frexp(&mut exp);
6789 assert_eq!(IEK_NAN, exp);
6790 assert!(frac.is_nan() && !frac.is_signaling());
6791 assert_eq!(payload, frac.to_bits() & ((1 << 51) - 1));
6793 let frac = "0x0.ffffp-1".parse::<Double>().unwrap().frexp(&mut exp);
6794 assert_eq!(-1, exp);
6795 assert!("0x1.fffep-1".parse::<Double>().unwrap().bitwise_eq(frac));
6797 let frac = "0x1p-51".parse::<Double>().unwrap().frexp(&mut exp);
6798 assert_eq!(-50, exp);
6799 assert!("0x1p-1".parse::<Double>().unwrap().bitwise_eq(frac));
6801 let frac = "0x1.c60f120d9f87cp+51".parse::<Double>().unwrap().frexp(
6804 assert_eq!(52, exp);
6806 "0x1.c60f120d9f87cp-1"
6817 let f1 = "1.5".parse::<Double>().unwrap();
6818 let f2 = "1.0".parse::<Double>().unwrap();
6819 let expected = "0.5".parse::<Double>().unwrap();
6820 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6821 assert_eq!(status, Status::OK);
6824 let f1 = "0.5".parse::<Double>().unwrap();
6825 let f2 = "1.0".parse::<Double>().unwrap();
6826 let expected = "0.5".parse::<Double>().unwrap();
6827 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6828 assert_eq!(status, Status::OK);
6831 let f1 = "0x1.3333333333333p-2".parse::<Double>().unwrap(); // 0.3
6832 let f2 = "0x1.47ae147ae147bp-7".parse::<Double>().unwrap(); // 0.01
6833 // 0.009999999999999983
6834 let expected = "0x1.47ae147ae1471p-7".parse::<Double>().unwrap();
6835 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6836 assert_eq!(status, Status::OK);
6839 let f1 = "0x1p64".parse::<Double>().unwrap(); // 1.8446744073709552e19
6840 let f2 = "1.5".parse::<Double>().unwrap();
6841 let expected = "1.0".parse::<Double>().unwrap();
6842 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6843 assert_eq!(status, Status::OK);
6846 let f1 = "0x1p1000".parse::<Double>().unwrap();
6847 let f2 = "0x1p-1000".parse::<Double>().unwrap();
6848 let expected = "0.0".parse::<Double>().unwrap();
6849 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6850 assert_eq!(status, Status::OK);
6853 let f1 = "0.0".parse::<Double>().unwrap();
6854 let f2 = "1.0".parse::<Double>().unwrap();
6855 let expected = "0.0".parse::<Double>().unwrap();
6856 assert!(unpack!(status=, f1 % f2).bitwise_eq(expected));
6857 assert_eq!(status, Status::OK);
6860 let f1 = "1.0".parse::<Double>().unwrap();
6861 let f2 = "0.0".parse::<Double>().unwrap();
6862 assert!(unpack!(status=, f1 % f2).is_nan());
6863 assert_eq!(status, Status::INVALID_OP);
6866 let f1 = "0.0".parse::<Double>().unwrap();
6867 let f2 = "0.0".parse::<Double>().unwrap();
6868 assert!(unpack!(status=, f1 % f2).is_nan());
6869 assert_eq!(status, Status::INVALID_OP);
6872 let f1 = Double::INFINITY;
6873 let f2 = "1.0".parse::<Double>().unwrap();
6874 assert!(unpack!(status=, f1 % f2).is_nan());
6875 assert_eq!(status, Status::INVALID_OP);