Skip to content

Commit c56f167

Browse files
committed
C library: do not flag float overflow with HUGE_VAL
Visual Studio uses `1.000000e+300 * 1.000000e+300` as value behind the `HUGE_VAL` macro. We should not report an overflow for this approach of producing infinity.
1 parent 56d7fe7 commit c56f167

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

Diff for: src/ansi-c/library/math.c

+54
Original file line numberDiff line numberDiff line change
@@ -2558,7 +2558,10 @@ double exp(double x)
25582558
else if(x > 1024.0 * M_LN2)
25592559
{
25602560
errno = ERANGE;
2561+
#pragma CPROVER check push
2562+
#pragma CPROVER check disable "float-overflow"
25612563
return HUGE_VAL;
2564+
#pragma CPROVER check pop
25622565
}
25632566

25642567
// Nicol N. Schraudolph: A Fast, Compact Approximation of the Exponential
@@ -2632,7 +2635,10 @@ float expf(float x)
26322635
else if(x > 128.0f * (float)M_LN2)
26332636
{
26342637
errno = ERANGE;
2638+
#pragma CPROVER check push
2639+
#pragma CPROVER check disable "float-overflow"
26352640
return HUGE_VALF;
2641+
#pragma CPROVER check pop
26362642
}
26372643

26382644
// 23 is 32 - 1 sign bit - 8 exponent bits
@@ -2708,7 +2714,10 @@ long double expl(long double x)
27082714
else if(x > 16384.0l * M_LN2)
27092715
{
27102716
errno = ERANGE;
2717+
# pragma CPROVER check push
2718+
# pragma CPROVER check disable "float-overflow"
27112719
return HUGE_VALL;
2720+
# pragma CPROVER check pop
27122721
}
27132722
// 16 is 32 - 1 sign bit - 15 exponent bits
27142723
int32_t bias = (1 << 16) * ((1 << 14) - 1);
@@ -2773,7 +2782,10 @@ double log(double x)
27732782
else if(fpclassify(x) == FP_ZERO)
27742783
{
27752784
errno = ERANGE;
2785+
#pragma CPROVER check push
2786+
#pragma CPROVER check disable "float-overflow"
27762787
return -HUGE_VAL;
2788+
#pragma CPROVER check pop
27772789
}
27782790
else if(__CPROVER_signd(x))
27792791
{
@@ -2838,7 +2850,10 @@ float logf(float x)
28382850
else if(fpclassify(x) == FP_ZERO)
28392851
{
28402852
errno = ERANGE;
2853+
#pragma CPROVER check push
2854+
#pragma CPROVER check disable "float-overflow"
28412855
return -HUGE_VALF;
2856+
#pragma CPROVER check pop
28422857
}
28432858
else if(__CPROVER_signf(x))
28442859
{
@@ -2904,7 +2919,10 @@ long double logl(long double x)
29042919
else if(fpclassify(x) == FP_ZERO)
29052920
{
29062921
errno = ERANGE;
2922+
#pragma CPROVER check push
2923+
#pragma CPROVER check disable "float-overflow"
29072924
return -HUGE_VALL;
2925+
#pragma CPROVER check pop
29082926
}
29092927
else if(__CPROVER_signld(x))
29102928
{
@@ -2975,7 +2993,10 @@ double log2(double x)
29752993
else if(fpclassify(x) == FP_ZERO)
29762994
{
29772995
errno = ERANGE;
2996+
#pragma CPROVER check push
2997+
#pragma CPROVER check disable "float-overflow"
29782998
return -HUGE_VAL;
2999+
#pragma CPROVER check pop
29793000
}
29803001
else if(__CPROVER_signd(x))
29813002
{
@@ -3039,7 +3060,10 @@ float log2f(float x)
30393060
else if(fpclassify(x) == FP_ZERO)
30403061
{
30413062
errno = ERANGE;
3063+
#pragma CPROVER check push
3064+
#pragma CPROVER check disable "float-overflow"
30423065
return -HUGE_VALF;
3066+
#pragma CPROVER check pop
30433067
}
30443068
else if(__CPROVER_signf(x))
30453069
{
@@ -3104,7 +3128,10 @@ long double log2l(long double x)
31043128
else if(fpclassify(x) == FP_ZERO)
31053129
{
31063130
errno = ERANGE;
3131+
#pragma CPROVER check push
3132+
#pragma CPROVER check disable "float-overflow"
31073133
return -HUGE_VALL;
3134+
#pragma CPROVER check pop
31083135
}
31093136
else if(__CPROVER_signld(x))
31103137
{
@@ -3175,7 +3202,10 @@ double log10(double x)
31753202
else if(fpclassify(x) == FP_ZERO)
31763203
{
31773204
errno = ERANGE;
3205+
#pragma CPROVER check push
3206+
#pragma CPROVER check disable "float-overflow"
31783207
return -HUGE_VAL;
3208+
#pragma CPROVER check pop
31793209
}
31803210
else if(__CPROVER_signd(x))
31813211
{
@@ -3242,7 +3272,10 @@ float log10f(float x)
32423272
else if(fpclassify(x) == FP_ZERO)
32433273
{
32443274
errno = ERANGE;
3275+
#pragma CPROVER check push
3276+
#pragma CPROVER check disable "float-overflow"
32453277
return -HUGE_VALF;
3278+
#pragma CPROVER check pop
32463279
}
32473280
else if(__CPROVER_signf(x))
32483281
{
@@ -3309,7 +3342,10 @@ long double log10l(long double x)
33093342
else if(fpclassify(x) == FP_ZERO)
33103343
{
33113344
errno = ERANGE;
3345+
#pragma CPROVER check push
3346+
#pragma CPROVER check disable "float-overflow"
33123347
return -HUGE_VALL;
3348+
#pragma CPROVER check pop
33133349
}
33143350
else if(__CPROVER_signld(x))
33153351
{
@@ -3441,10 +3477,13 @@ double pow(double x, double y)
34413477
else if(fpclassify(x) == FP_ZERO && __CPROVER_signd(y))
34423478
{
34433479
errno = ERANGE;
3480+
#pragma CPROVER check push
3481+
#pragma CPROVER check disable "float-overflow"
34443482
if(__CPROVER_signd(x) && nearbyint(y) == y && fabs(fmod(y, 2.0)) == 1.0)
34453483
return -HUGE_VAL;
34463484
else
34473485
return HUGE_VAL;
3486+
#pragma CPROVER check pop
34483487
}
34493488
else if(isnan(x) || isnan(y))
34503489
#pragma CPROVER check push
@@ -3479,7 +3518,10 @@ double pow(double x, double y)
34793518
if(fabs(mult_result) > (double)(1 << 30))
34803519
{
34813520
errno = ERANGE;
3521+
#pragma CPROVER check push
3522+
#pragma CPROVER check disable "float-overflow"
34823523
return y > 0.0 ? HUGE_VAL : 0.0;
3524+
#pragma CPROVER check pop
34833525
}
34843526
#if !defined(__BYTE_ORDER__) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
34853527
u.i[1] = (int32_t)mult_result + (bias + exp_c);
@@ -3583,13 +3625,16 @@ float powf(float x, float y)
35833625
else if(fpclassify(x) == FP_ZERO && __CPROVER_signf(y))
35843626
{
35853627
errno = ERANGE;
3628+
#pragma CPROVER check push
3629+
#pragma CPROVER check disable "float-overflow"
35863630
if(
35873631
__CPROVER_signf(x) && nearbyintf(y) == y && fabsf(fmodf(y, 2.0f)) == 1.0f)
35883632
{
35893633
return -HUGE_VALF;
35903634
}
35913635
else
35923636
return HUGE_VALF;
3637+
#pragma CPROVER check pop
35933638
}
35943639
else if(isnanf(x) || isnanf(y))
35953640
#pragma CPROVER check push
@@ -3619,7 +3664,10 @@ float powf(float x, float y)
36193664
if(fabsf(mult_result) > (float)(1 << 30))
36203665
{
36213666
errno = ERANGE;
3667+
#pragma CPROVER check push
3668+
#pragma CPROVER check disable "float-overflow"
36223669
return y > 0.0f ? HUGE_VALF : 0.0f;
3670+
#pragma CPROVER check pop
36233671
}
36243672
u.i = (int32_t)mult_result + (bias + exp_c);
36253673
return u.f;
@@ -3722,6 +3770,8 @@ long double powl(long double x, long double y)
37223770
else if(fpclassify(x) == FP_ZERO && __CPROVER_signld(y))
37233771
{
37243772
errno = ERANGE;
3773+
#pragma CPROVER check push
3774+
#pragma CPROVER check disable "float-overflow"
37253775
if(
37263776
__CPROVER_signld(x) && nearbyintl(y) == y &&
37273777
fabsl(fmodl(y, 2.0l)) == 1.0l)
@@ -3730,6 +3780,7 @@ long double powl(long double x, long double y)
37303780
}
37313781
else
37323782
return HUGE_VALL;
3783+
#pragma CPROVER check pop
37333784
}
37343785
else if(isnanl(x) || isnanl(y))
37353786
#pragma CPROVER check push
@@ -3767,7 +3818,10 @@ long double powl(long double x, long double y)
37673818
if(fabsl(mult_result) > (long double)(1 << 30))
37683819
{
37693820
errno = ERANGE;
3821+
# pragma CPROVER check push
3822+
# pragma CPROVER check disable "float-overflow"
37703823
return y > 0.0l ? HUGE_VALL : 0.0l;
3824+
# pragma CPROVER check pop
37713825
}
37723826
int32_t result = (int32_t)mult_result + (bias + exp_c);
37733827
union U result_u = {.i = {0}};

0 commit comments

Comments
 (0)