我已经开始使用小型浮点模糊器。现在它做的很少,但你必须从一些事情开始。
这是一个用于比较生成 SSE2 指令的编译器的示例,我声称没有理由生成不同的结果:
#include <stdio.h>
double x0 = 35945970.47e-83;
double x1 = (973e-37+(5626073.612783921311173024e-76*231.106261545926274055e1*66390306733994e-1*420514.99786508*654374994.1249111e-35*5201.6039804e56)+(2.93604195+33e-50)+(969222843.32046212043603+1734e01)+(0166605914e8+6701040019050623e-23+32591206968562.6e-11+90771798.753788905)+(328e-49/944642906580982081e7));
int main(){
x0 = (((x1*534425399171e0)*(x1*x0*x0)*(x1*x0*57063248719.703555336277392e-36*x0*472e57*65189741246535e-1)*x1*(x1/22393742341e70)*(x1+x0+x0+x0))-((843193503867271987e3*61.949746266e23*x1*x1*x0)/(x1/x1)));
x0 = ((x0+x1+x1+x1+x0)-(x0*506680.0005767722e66*396.650621163*70798334426455964.1*x1*305369e14));
x1 = 660098705340e-21;
printf("%a\n", x0);
}
对于这个程序,gcc
并且clang
(在这个平台上生成 SSE2 指令)生成计算相同事物的可执行文件:
~/genfloat $ gcc t.c ; ./a.out
0x1.5c5a77a63c1d6p+430
~/genfloat $ clang t.c ; ./a.out
0x1.5c5a77a63c1d6p+430
我还打算测试一个静态分析器,该分析器应该预测使用 x87 指令编译的程序可以获得的所有可能结果,以不可预测的方式将一些中间结果溢出到双精度内存位置:
~/genfloat $ frama-c -val -float-hex -all-rounding-modes t.c
...
x0 ∈ [0x1.5c5a77a63c1cap430 .. 0x1.5c5a77a63c1e8p430]
以上是一个需要测试的强有力的主张。