@@ -497,7 +497,7 @@ TEST(Numeric_decimal, is_float_simple_values) {
497497 const sourcemeta::core::Decimal value2{" 3.14" };
498498 const sourcemeta::core::Decimal value3{" -2.5" };
499499 EXPECT_TRUE (value1.is_float ());
500- EXPECT_TRUE (value2.is_float ());
500+ EXPECT_FALSE (value2.is_float ());
501501 EXPECT_TRUE (value3.is_float ());
502502}
503503
@@ -515,12 +515,92 @@ TEST(Numeric_decimal, is_float_high_precision_loss) {
515515 EXPECT_FALSE (value.is_float ());
516516}
517517
518+ TEST (Numeric_decimal, is_float_large_exponent_in_range) {
519+ const sourcemeta::core::Decimal value{" 1.5e30" };
520+ EXPECT_FALSE (value.is_float ());
521+ }
522+
523+ TEST (Numeric_decimal, is_float_large_negative_exponent_in_range) {
524+ const sourcemeta::core::Decimal value{" 1.5e-30" };
525+ EXPECT_TRUE (value.is_float ());
526+ }
527+
528+ TEST (Numeric_decimal, is_float_too_large) {
529+ const sourcemeta::core::Decimal value{" 1e100" };
530+ EXPECT_FALSE (value.is_float ());
531+ }
532+
533+ TEST (Numeric_decimal, is_float_too_small) {
534+ const sourcemeta::core::Decimal value{" 1e-100" };
535+ EXPECT_FALSE (value.is_float ());
536+ }
537+
538+ TEST (Numeric_decimal, is_float_near_max_float) {
539+ const sourcemeta::core::Decimal value{" 3.4e38" };
540+ EXPECT_FALSE (value.is_float ());
541+ }
542+
543+ TEST (Numeric_decimal, is_float_exceeds_max_float) {
544+ const sourcemeta::core::Decimal value{" 4e38" };
545+ EXPECT_FALSE (value.is_float ());
546+ }
547+
548+ TEST (Numeric_decimal, is_float_near_min_float) {
549+ const sourcemeta::core::Decimal value{" 1.2e-38" };
550+ EXPECT_FALSE (value.is_float ());
551+ }
552+
553+ TEST (Numeric_decimal, is_float_below_min_float) {
554+ const sourcemeta::core::Decimal value{" 1e-50" };
555+ EXPECT_FALSE (value.is_float ());
556+ }
557+
558+ TEST (Numeric_decimal, is_float_6_significant_digits) {
559+ const sourcemeta::core::Decimal value{" 1.234375" };
560+ EXPECT_TRUE (value.is_float ());
561+ }
562+
563+ TEST (Numeric_decimal, is_float_7_significant_digits_no_loss) {
564+ const sourcemeta::core::Decimal value{" 1.2343750" };
565+ EXPECT_TRUE (value.is_float ());
566+ }
567+
568+ TEST (Numeric_decimal, is_float_many_digits_with_loss) {
569+ const sourcemeta::core::Decimal value{" 1.23456789" };
570+ EXPECT_FALSE (value.is_float ());
571+ }
572+
573+ TEST (Numeric_decimal, is_float_big_integer_in_float_range) {
574+ const sourcemeta::core::Decimal value{" 16777216" };
575+ EXPECT_TRUE (value.is_float ());
576+ }
577+
578+ TEST (Numeric_decimal, is_float_big_integer_exceeds_precision) {
579+ const sourcemeta::core::Decimal value{" 16777217" };
580+ EXPECT_FALSE (value.is_float ());
581+ }
582+
583+ TEST (Numeric_decimal, is_float_small_value_with_exponent) {
584+ const sourcemeta::core::Decimal value{" 1.0e-10" };
585+ EXPECT_FALSE (value.is_float ());
586+ }
587+
588+ TEST (Numeric_decimal, is_float_zero) {
589+ const sourcemeta::core::Decimal value{" 0.0" };
590+ EXPECT_TRUE (value.is_float ());
591+ }
592+
593+ TEST (Numeric_decimal, is_float_negative_zero) {
594+ const sourcemeta::core::Decimal value{" -0.0" };
595+ EXPECT_TRUE (value.is_float ());
596+ }
597+
518598TEST (Numeric_decimal, is_double_simple_values) {
519599 const sourcemeta::core::Decimal value1{3 };
520600 const sourcemeta::core::Decimal value2{" 3.14" };
521601 const sourcemeta::core::Decimal value3{" -2.5" };
522602 EXPECT_TRUE (value1.is_double ());
523- EXPECT_TRUE (value2.is_double ());
603+ EXPECT_FALSE (value2.is_double ());
524604 EXPECT_TRUE (value3.is_double ());
525605}
526606
@@ -539,6 +619,86 @@ TEST(Numeric_decimal, is_double_high_precision_loss) {
539619 EXPECT_FALSE (value.is_double ());
540620}
541621
622+ TEST (Numeric_decimal, is_double_large_exponent_in_range) {
623+ const sourcemeta::core::Decimal value{" 1.5e100" };
624+ EXPECT_FALSE (value.is_double ());
625+ }
626+
627+ TEST (Numeric_decimal, is_double_large_negative_exponent_in_range) {
628+ const sourcemeta::core::Decimal value{" 1.5e-100" };
629+ EXPECT_TRUE (value.is_double ());
630+ }
631+
632+ TEST (Numeric_decimal, is_double_too_large) {
633+ const sourcemeta::core::Decimal value{" 1e500" };
634+ EXPECT_FALSE (value.is_double ());
635+ }
636+
637+ TEST (Numeric_decimal, is_double_too_small) {
638+ const sourcemeta::core::Decimal value{" 1e-500" };
639+ EXPECT_FALSE (value.is_double ());
640+ }
641+
642+ TEST (Numeric_decimal, is_double_near_max_double) {
643+ const sourcemeta::core::Decimal value{" 1.7e308" };
644+ EXPECT_FALSE (value.is_double ());
645+ }
646+
647+ TEST (Numeric_decimal, is_double_exceeds_max_double) {
648+ const sourcemeta::core::Decimal value{" 2e308" };
649+ EXPECT_FALSE (value.is_double ());
650+ }
651+
652+ TEST (Numeric_decimal, is_double_near_min_double) {
653+ const sourcemeta::core::Decimal value{" 2.2e-308" };
654+ EXPECT_FALSE (value.is_double ());
655+ }
656+
657+ TEST (Numeric_decimal, is_double_below_min_double) {
658+ const sourcemeta::core::Decimal value{" 1e-400" };
659+ EXPECT_FALSE (value.is_double ());
660+ }
661+
662+ TEST (Numeric_decimal, is_double_15_significant_digits) {
663+ const sourcemeta::core::Decimal value{" 1.23456789012345" };
664+ EXPECT_TRUE (value.is_double ());
665+ }
666+
667+ TEST (Numeric_decimal, is_double_16_significant_digits_no_loss) {
668+ const sourcemeta::core::Decimal value{" 1.234567890123456" };
669+ EXPECT_TRUE (value.is_double ());
670+ }
671+
672+ TEST (Numeric_decimal, is_double_many_digits_with_loss) {
673+ const sourcemeta::core::Decimal value{" 1.234567890123456789" };
674+ EXPECT_FALSE (value.is_double ());
675+ }
676+
677+ TEST (Numeric_decimal, is_double_big_integer_in_double_range) {
678+ const sourcemeta::core::Decimal value{" 9007199254740992" };
679+ EXPECT_TRUE (value.is_double ());
680+ }
681+
682+ TEST (Numeric_decimal, is_double_big_integer_exceeds_precision) {
683+ const sourcemeta::core::Decimal value{" 9007199254740993" };
684+ EXPECT_FALSE (value.is_double ());
685+ }
686+
687+ TEST (Numeric_decimal, is_double_small_value_with_exponent) {
688+ const sourcemeta::core::Decimal value{" 1.0e-28" };
689+ EXPECT_FALSE (value.is_double ());
690+ }
691+
692+ TEST (Numeric_decimal, is_double_zero) {
693+ const sourcemeta::core::Decimal value{" 0.0" };
694+ EXPECT_TRUE (value.is_double ());
695+ }
696+
697+ TEST (Numeric_decimal, is_double_negative_zero) {
698+ const sourcemeta::core::Decimal value{" -0.0" };
699+ EXPECT_TRUE (value.is_double ());
700+ }
701+
542702TEST (Numeric_decimal, to_float_simple) {
543703 const sourcemeta::core::Decimal value{" 3.14" };
544704 EXPECT_FLOAT_EQ (value.to_float (), 3 .14f );
0 commit comments