, , , .
, , .
-fno-signed-zeros
, .
FP w.r.t. : 0 · x = x · 0 ≠ 0, , , , -3 · 0 = -0 ≠ 0 ( 0 +0).
live on Godbolt, -Ofast
float f(float a)
{
return a*0;
}
;With -Ofast
f(float): # @f(float)
xorps xmm0, xmm0
ret
;With -O3
f(float): # @f(float)
xorps xmm1, xmm1
mulss xmm0, xmm1
ret
A EOF , .
-freciprocal-math
: a/b = a · (1/b).
- FP .
, , . .
. why-is-freciprocal-math-unsafe-in-gcc?.
Live Godbolt:
float f(float a){
return a/3;
}
;With -Ofast
.LCPI0_0:
.long 1051372203 # float 0.333333343
f(float): # @f(float)
mulss xmm0, dword ptr [rip + .LCPI0_0]
ret
;With -O3
.LCPI0_0:
.long 1077936128 # float 3
f(float): # @f(float)
divss xmm0, dword ptr [rip + .LCPI0_0]
ret
-ffp-contract=fast
FP.
, field ℝ, .
, a * k/k = a.
FP, + ·, - .
FP .
Live Godbolt:
float f(float a){
return a/3*3;
}
;With -Ofast
f(float): # @f(float)
ret
;With -O3
.LCPI0_0:
.long 1077936128 # float 3
f(float): # @f(float)
movss xmm1, dword ptr [rip + .LCPI0_0] # xmm1 = mem[0],zero,zero,zero
divss xmm0, xmm1
mulss xmm0, xmm1
ret
-menable-unsafe-fp-math
, .
, IEEE (, ) . , (, fsin X86).
. fsin.
Godbolt, a 4 (a 2/sup > ) 2
float f(float a){
return a*a*a*a;
}
f(float): # @f(float)
mulss xmm0, xmm0
mulss xmm0, xmm0
ret
f(float): # @f(float)
movaps xmm1, xmm0
mulss xmm1, xmm1
mulss xmm1, xmm0
mulss xmm1, xmm0
movaps xmm0, xmm1
ret
-menable-no-nans
, NaN.
, , NaN.
FP NaN .
, , live Godbolt
bool f(float a, float b){
return a<b;
}
;With -Ofast
f(float, float): # @f(float, float)
ucomiss xmm0, xmm1
setb al
ret
;With -O3
f(float, float): # @f(float, float)
ucomiss xmm1, xmm0
seta al
ret
, , -O3 , a b , true.
, /.
-menable-no-infs
, .
Godbolt, , .
mb- glibc (, sinc) , -Ofast.