@@ -355,99 +355,202 @@ TEST(ConvertToBits, isize) {
355
355
}
356
356
357
357
TEST (ConvertToBits, f32) {
358
- // Bit value 0b1100'0000'0101'0101'1101'0101'0000'1110.
359
- constexpr auto v = -3 .34112882614_f32;
358
+ static_assert (std::same_as<decltype (sus::to_bits<u16>(0_f32)), u16>);
360
359
361
360
// Float to smaller unsigned.
362
361
{
363
- auto i = sus::to_bits<u16>(v);
364
- static_assert (std::same_as<decltype (i), u16>);
365
- EXPECT_EQ (i, 0b1101'0101'0000' 1110_u16);
366
- auto f = sus::to_bits<f32>(i);
367
- EXPECT_EQ (f, 7 .64296208412e-41_f32);
368
- }
369
- // Float to larger unsigned.
370
- {
371
- auto i = sus::to_bits<u64>(v);
372
- static_assert (std::same_as<decltype (i), u64>);
373
- EXPECT_EQ (i, 0b1100'0000'0101'0101'1101'0101'0000'1110 );
374
- auto f = sus::to_bits<f32>(i);
375
- EXPECT_EQ (f, v);
362
+ EXPECT_EQ (sus::to_bits<u16>(f32::NAN), 0_u16);
363
+
364
+ EXPECT_EQ (sus::to_bits<u16>(0_f32), u16::MIN);
365
+ EXPECT_EQ (sus::to_bits<u16>(-0_f32), u16::MIN);
366
+ EXPECT_EQ (sus::to_bits<u16>(-0 .00001_f32), u16::MIN);
367
+ EXPECT_EQ (sus::to_bits<u16>(-99999999_f32), u16::MIN);
368
+ EXPECT_EQ (sus::to_bits<u16>(f32::NEG_INFINITY), u16::MIN);
369
+
370
+ EXPECT_EQ (sus::to_bits<u16>(0 .1_f32), 0_u16);
371
+ EXPECT_EQ (sus::to_bits<u16>(0 .51_f32), 0_u16);
372
+ EXPECT_EQ (sus::to_bits<u16>(0 .9999_f32), 0_u16);
373
+ EXPECT_EQ (sus::to_bits<u16>(1_f32), 1_u16);
374
+ EXPECT_EQ (sus::to_bits<u16>(65535_f32), u16::MAX);
375
+ EXPECT_EQ (sus::to_bits<u16>(65535 .00001_f32), u16::MAX);
376
+ EXPECT_EQ (sus::to_bits<u16>(65536_f32), u16::MAX);
377
+ EXPECT_EQ (sus::to_bits<u16>(999999999_f32), u16::MAX);
378
+ EXPECT_EQ (sus::to_bits<u16>(f32::INFINITY), u16::MAX);
376
379
}
377
380
// Float to smaller signed.
378
381
{
379
- auto i = sus::to_bits<i16>(v);
380
- static_assert (std::same_as<decltype (i), i16>);
381
- EXPECT_EQ (i, sus::to_bits<i16>(0b1101'0101'0000' 1110_u16));
382
- EXPECT_EQ (i, -10994 );
383
- auto f = sus::to_bits<f32>(i);
384
- EXPECT_EQ (f, 7 .64296208412e-41_f32);
382
+ EXPECT_EQ (sus::to_bits<i16>(f32::NAN), 0_i16);
383
+
384
+ EXPECT_EQ (sus::to_bits<i16>(0_f32), 0_i16);
385
+ EXPECT_EQ (sus::to_bits<i16>(-0_f32), 0_i16);
386
+ EXPECT_EQ (sus::to_bits<i16>(-0 .00001_f32), 0_i16);
387
+ EXPECT_EQ (sus::to_bits<i16>(-0 .9999_f32), 0_i16);
388
+ EXPECT_EQ (sus::to_bits<i16>(-1_f32), -1_i16);
389
+ EXPECT_EQ (sus::to_bits<i16>(-32767 .999_f32), -32767_i16);
390
+ EXPECT_EQ (sus::to_bits<i16>(-32768_f32), i16::MIN);
391
+ EXPECT_EQ (sus::to_bits<i16>(-32768 .00001_f32), i16::MIN);
392
+ EXPECT_EQ (sus::to_bits<i16>(-99999999_f32), i16::MIN);
393
+ EXPECT_EQ (sus::to_bits<i16>(f32::NEG_INFINITY), i16::MIN);
394
+
395
+ EXPECT_EQ (sus::to_bits<i16>(0 .1_f32), 0_i16);
396
+ EXPECT_EQ (sus::to_bits<i16>(0 .51_f32), 0_i16);
397
+ EXPECT_EQ (sus::to_bits<i16>(0 .9999_f32), 0_i16);
398
+ EXPECT_EQ (sus::to_bits<i16>(1_f32), 1_i16);
399
+ EXPECT_EQ (sus::to_bits<i16>(32767 .999_f32), i16::MAX);
400
+ EXPECT_EQ (sus::to_bits<i16>(32767 .00001_f32), i16::MAX);
401
+ EXPECT_EQ (sus::to_bits<i16>(32767_f32), i16::MAX);
402
+ EXPECT_EQ (sus::to_bits<i16>(999999999_f32), i16::MAX);
403
+ EXPECT_EQ (sus::to_bits<i16>(f32::INFINITY), i16::MAX);
385
404
}
386
- // Float to larger signed.
405
+
406
+ // Float to larger unsigned.
387
407
{
388
- auto i = sus::to_bits<i64>(v);
389
- static_assert (std::same_as<decltype (i), i64>);
390
- EXPECT_EQ (i, sus::to_bits<i64>(0b1100'0000'0101'0101'1101'0101'0000'1110 ));
391
- EXPECT_EQ (i, 3226850574 );
392
- auto f = sus::to_bits<f32>(i);
393
- EXPECT_EQ (f, v);
408
+ EXPECT_EQ (sus::to_bits<u64>(f32::NAN), 0_u64);
409
+
410
+ EXPECT_EQ (sus::to_bits<u64>(0_f32), u64::MIN);
411
+ EXPECT_EQ (sus::to_bits<u64>(-0_f32), u64::MIN);
412
+ EXPECT_EQ (sus::to_bits<u64>(-0 .00001_f32), u64::MIN);
413
+ EXPECT_EQ (sus::to_bits<u64>(-99999999_f32), u64::MIN);
414
+ EXPECT_EQ (sus::to_bits<u64>(f32::NEG_INFINITY), u64::MIN);
415
+
416
+ EXPECT_EQ (sus::to_bits<u64>(0 .1_f32), 0_u64);
417
+ EXPECT_EQ (sus::to_bits<u64>(0 .51_f32), 0_u64);
418
+ EXPECT_EQ (sus::to_bits<u64>(0 .9999_f32), 0_u64);
419
+ EXPECT_EQ (sus::to_bits<u64>(1_f32), 1_u64);
420
+ EXPECT_LT (sus::to_bits<u64>((18446744073709551615_f32).next_toward (0_f32)),
421
+ u64::MAX);
422
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f32), u64::MAX);
423
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615 .00001_f32), u64::MAX);
424
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f32 + 1_f32), u64::MAX);
425
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f32 * 2_f32), u64::MAX);
426
+ EXPECT_EQ (sus::to_bits<u64>(f32::INFINITY), u64::MAX);
394
427
}
395
- // Float to double .
428
+ // Float to larger signed .
396
429
{
397
- auto i = sus::to_bits<f64>(v);
398
- static_assert (std::same_as<decltype (i), f64>);
399
- EXPECT_EQ (i, 1 .59427601287650712395167736662e-314_f64);
400
- auto f = sus::to_bits<f32>(i);
401
- EXPECT_EQ (f, v);
430
+ EXPECT_EQ (sus::to_bits<i64>(f32::NAN), 0_i64);
431
+
432
+ EXPECT_EQ (sus::to_bits<i64>(0_f32), 0_i64);
433
+ EXPECT_EQ (sus::to_bits<i64>(-0_f32), 0_i64);
434
+ EXPECT_EQ (sus::to_bits<i64>(-0 .00001_f32), 0_i64);
435
+ EXPECT_EQ (sus::to_bits<i64>(-0 .9999_f32), 0_i64);
436
+ EXPECT_EQ (sus::to_bits<i64>(-1_f32), -1_i64);
437
+ EXPECT_GT (sus::to_bits<i64>((-9223372036854775808_f32).next_toward (0_f32)),
438
+ i64::MIN);
439
+ EXPECT_EQ (sus::to_bits<i64>(-9223372036854775808_f32), i64::MIN);
440
+ EXPECT_EQ (sus::to_bits<i64>(-9223372036854775808 .00001_f32), i64::MIN);
441
+ EXPECT_EQ (sus::to_bits<i64>(-9999999999999999999_f32), i64::MIN);
442
+ EXPECT_EQ (sus::to_bits<i64>(f32::NEG_INFINITY), i64::MIN);
443
+
444
+ EXPECT_EQ (sus::to_bits<i64>(0 .1_f32), 0_i64);
445
+ EXPECT_EQ (sus::to_bits<i64>(0 .51_f32), 0_i64);
446
+ EXPECT_EQ (sus::to_bits<i64>(0 .9999_f32), 0_i64);
447
+ EXPECT_EQ (sus::to_bits<i64>(1_f32), 1_i64);
448
+ EXPECT_LT (sus::to_bits<i64>((9223372036854775807_f32).next_toward (0_f32)),
449
+ i64::MAX);
450
+ EXPECT_EQ (sus::to_bits<i64>(9223372036854775807_f32), i64::MAX);
451
+ EXPECT_EQ (sus::to_bits<i64>(92233720368547758075 .00001_f32), i64::MAX);
452
+ EXPECT_EQ (sus::to_bits<i64>(9223372036854775808_f32), i64::MAX);
453
+ EXPECT_EQ (sus::to_bits<i64>(9999999999999999999_f32), i64::MAX);
454
+ EXPECT_EQ (sus::to_bits<i64>(f32::INFINITY), i64::MAX);
402
455
}
403
456
}
404
457
405
458
TEST (ConvertToBits, f64) {
406
- // Bit value
407
- // 0b10101000'10101010'10101010'00101010'10101000'10101010'10101110'11101110.
408
- constexpr auto v = -8 .66220694718676082014277885371e-113_f64;
409
-
410
- // Double to smaller unsigned.
411
- {
412
- auto i = sus::to_bits<u16>(v);
413
- static_assert (std::same_as<decltype (i), u16>);
414
- EXPECT_EQ (i, 0b10101110' 11101110_u16);
415
- auto f = sus::to_bits<f64>(i);
416
- EXPECT_EQ (f, 2 .21252477520627027413151036822e-319_f64);
417
- }
418
- // Double to unsigned.
419
- {
420
- auto i = sus::to_bits<u64>(v);
421
- static_assert (std::same_as<decltype (i), u64>);
422
- EXPECT_EQ (i, 0b10101000'10101010'10101010'00101010'10101000'10101010'10101110' 11101110_u64);
423
- auto f = sus::to_bits<f64>(i);
424
- EXPECT_EQ (f, v);
425
- }
426
- // Double to smaller signed.
427
- {
428
- auto i = sus::to_bits<i16>(v);
429
- static_assert (std::same_as<decltype (i), i16>);
430
- EXPECT_EQ (i, sus::to_bits<i16>(0b10101110' 11101110_u16));
431
- EXPECT_EQ (i, -20754 );
432
- auto f = sus::to_bits<f64>(i);
433
- EXPECT_EQ (f, 2 .21252477520627027413151036822e-319_f64);
434
- }
435
- // Double to signed.
436
- {
437
- auto i = sus::to_bits<i64>(v);
438
- static_assert (std::same_as<decltype (i), i64>);
439
- EXPECT_EQ (i, sus::to_bits<i64>(0b10101000'10101010'10101010'00101010'10101000'10101010'10101110' 11101110_u64));
440
- EXPECT_EQ (i, -6293030429101740306 );
441
- auto f = sus::to_bits<f64>(i);
442
- EXPECT_EQ (f, v);
443
- }
444
- // Double to float.
445
- {
446
- auto i = sus::to_bits<f32>(v);
447
- static_assert (std::same_as<decltype (i), f32>);
448
- EXPECT_EQ (i, -1 .89496550775e-14_f32);
449
- auto f = sus::to_bits<f64>(i);
450
- EXPECT_EQ (f, 1 .39808630771690684819284234772e-314_f64);
459
+ static_assert (std::same_as<decltype (sus::to_bits<u16>(0_f64)), u16>);
460
+
461
+ // Float to smaller unsigned.
462
+ {
463
+ EXPECT_EQ (sus::to_bits<u16>(f64::NAN), 0_u16);
464
+
465
+ EXPECT_EQ (sus::to_bits<u16>(0_f64), u16::MIN);
466
+ EXPECT_EQ (sus::to_bits<u16>(-0_f64), u16::MIN);
467
+ EXPECT_EQ (sus::to_bits<u16>(-0 .00001_f64), u16::MIN);
468
+ EXPECT_EQ (sus::to_bits<u16>(-99999999_f64), u16::MIN);
469
+ EXPECT_EQ (sus::to_bits<u16>(f64::NEG_INFINITY), u16::MIN);
470
+
471
+ EXPECT_EQ (sus::to_bits<u16>(0 .1_f64), 0_u16);
472
+ EXPECT_EQ (sus::to_bits<u16>(0 .51_f64), 0_u16);
473
+ EXPECT_EQ (sus::to_bits<u16>(0 .9999_f64), 0_u16);
474
+ EXPECT_EQ (sus::to_bits<u16>(1_f64), 1_u16);
475
+ EXPECT_EQ (sus::to_bits<u16>(65535_f64), u16::MAX);
476
+ EXPECT_EQ (sus::to_bits<u16>(65535 .00001_f64), u16::MAX);
477
+ EXPECT_EQ (sus::to_bits<u16>(65536_f64), u16::MAX);
478
+ EXPECT_EQ (sus::to_bits<u16>(999999999_f64), u16::MAX);
479
+ EXPECT_EQ (sus::to_bits<u16>(f64::INFINITY), u16::MAX);
480
+ }
481
+ // Float to smaller signed.
482
+ {
483
+ EXPECT_EQ (sus::to_bits<i16>(f64::NAN), 0_i16);
484
+
485
+ EXPECT_EQ (sus::to_bits<i16>(0_f64), 0_i16);
486
+ EXPECT_EQ (sus::to_bits<i16>(-0_f64), 0_i16);
487
+ EXPECT_EQ (sus::to_bits<i16>(-0 .00001_f64), 0_i16);
488
+ EXPECT_EQ (sus::to_bits<i16>(-0 .9999_f64), 0_i16);
489
+ EXPECT_EQ (sus::to_bits<i16>(-1_f64), -1_i16);
490
+ EXPECT_EQ (sus::to_bits<i16>(-32767 .999_f64), -32767_i16);
491
+ EXPECT_EQ (sus::to_bits<i16>(-32768_f64), i16::MIN);
492
+ EXPECT_EQ (sus::to_bits<i16>(-32768 .00001_f64), i16::MIN);
493
+ EXPECT_EQ (sus::to_bits<i16>(-99999999_f64), i16::MIN);
494
+ EXPECT_EQ (sus::to_bits<i16>(f64::NEG_INFINITY), i16::MIN);
495
+
496
+ EXPECT_EQ (sus::to_bits<i16>(0 .1_f64), 0_i16);
497
+ EXPECT_EQ (sus::to_bits<i16>(0 .51_f64), 0_i16);
498
+ EXPECT_EQ (sus::to_bits<i16>(0 .9999_f64), 0_i16);
499
+ EXPECT_EQ (sus::to_bits<i16>(1_f64), 1_i16);
500
+ EXPECT_EQ (sus::to_bits<i16>(65535_f64), i16::MAX);
501
+ EXPECT_EQ (sus::to_bits<i16>(65535 .00001_f64), i16::MAX);
502
+ EXPECT_EQ (sus::to_bits<i16>(65536_f64), i16::MAX);
503
+ EXPECT_EQ (sus::to_bits<i16>(999999999_f64), i16::MAX);
504
+ EXPECT_EQ (sus::to_bits<i16>(f64::INFINITY), i16::MAX);
505
+ }
506
+
507
+ // Float to unsigned.
508
+ {
509
+ EXPECT_EQ (sus::to_bits<u64>(f64::NAN), 0_u64);
510
+
511
+ EXPECT_EQ (sus::to_bits<u64>(0_f64), u64::MIN);
512
+ EXPECT_EQ (sus::to_bits<u64>(-0_f64), u64::MIN);
513
+ EXPECT_EQ (sus::to_bits<u64>(-0 .00001_f64), u64::MIN);
514
+ EXPECT_EQ (sus::to_bits<u64>(-99999999_f64), u64::MIN);
515
+ EXPECT_EQ (sus::to_bits<u64>(f64::NEG_INFINITY), u64::MIN);
516
+
517
+ EXPECT_EQ (sus::to_bits<u64>(0 .1_f64), 0_u64);
518
+ EXPECT_EQ (sus::to_bits<u64>(0 .51_f64), 0_u64);
519
+ EXPECT_EQ (sus::to_bits<u64>(0 .9999_f64), 0_u64);
520
+ EXPECT_EQ (sus::to_bits<u64>(1_f64), 1_u64);
521
+ EXPECT_LT (sus::to_bits<u64>((18446744073709551615_f64).next_toward (0_f64)),
522
+ u64::MAX);
523
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f64), u64::MAX);
524
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615 .00001_f64), u64::MAX);
525
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f64 + 1_f64), u64::MAX);
526
+ EXPECT_EQ (sus::to_bits<u64>(18446744073709551615_f64 * 2_f64), u64::MAX);
527
+ EXPECT_EQ (sus::to_bits<u64>(f64::INFINITY), u64::MAX);
528
+ }
529
+ // Float to signed.
530
+ {
531
+ EXPECT_EQ (sus::to_bits<i64>(f64::NAN), 0_i64);
532
+
533
+ EXPECT_EQ (sus::to_bits<i64>(0_f64), 0_i64);
534
+ EXPECT_EQ (sus::to_bits<i64>(-0_f64), 0_i64);
535
+ EXPECT_EQ (sus::to_bits<i64>(-0 .00001_f64), 0_i64);
536
+ EXPECT_EQ (sus::to_bits<i64>(-0 .9999_f64), 0_i64);
537
+ EXPECT_EQ (sus::to_bits<i64>(-1_f64), -1_i64);
538
+ EXPECT_GT (sus::to_bits<i64>((-9223372036854775808_f64).next_toward (0_f64)),
539
+ i64::MIN);
540
+ EXPECT_EQ (sus::to_bits<i64>(-9223372036854775808_f64), i64::MIN);
541
+ EXPECT_EQ (sus::to_bits<i64>(-9223372036854775808 .00001_f64), i64::MIN);
542
+ EXPECT_EQ (sus::to_bits<i64>(-9223372036854775808_f64 * 2_f64), i64::MIN);
543
+ EXPECT_EQ (sus::to_bits<i64>(f64::NEG_INFINITY), i64::MIN);
544
+
545
+ EXPECT_EQ (sus::to_bits<i64>(0 .1_f64), 0_i64);
546
+ EXPECT_EQ (sus::to_bits<i64>(0 .51_f64), 0_i64);
547
+ EXPECT_EQ (sus::to_bits<i64>(0 .9999_f64), 0_i64);
548
+ EXPECT_EQ (sus::to_bits<i64>(1_f64), 1_i64);
549
+ EXPECT_LT (sus::to_bits<i64>((9223372036854775807_f64).next_toward (0_f64)), i64::MAX);
550
+ EXPECT_EQ (sus::to_bits<i64>(9223372036854775807_f64), i64::MAX);
551
+ EXPECT_EQ (sus::to_bits<i64>(9223372036854775807 .00001_f64), i64::MAX);
552
+ EXPECT_EQ (sus::to_bits<i64>(9223372036854775807_f64 * 2_f64), i64::MAX);
553
+ EXPECT_EQ (sus::to_bits<i64>(f64::INFINITY), i64::MAX);
451
554
}
452
555
}
453
556
0 commit comments