Floating point 什么是「;“有用的”;4字节浮点的范围?
假设我有一个函数Floating point 什么是「;“有用的”;4字节浮点的范围?,floating-point,x86,Floating Point,X86,假设我有一个函数f(x)=x*10^-N 在这种情况下,最大的N是什么 f(1)
f(x)=x*10^-N
在这种情况下,最大的N是什么
f(1)
f(2)
只要结果在-1和1之间,etc的最大值为x=10
结果存储在4字节浮点中之后
例如,我知道N=50是不可接受的,因为在存储在4字节浮点中之后,任何最多10个数字都会变成0
还有什么是最大的N,其中的结果还是让我们说90%的准确率
编辑:有问题的硬件:基于x86的现代处理器
EDIT2:同时,我创建了一个简单的东西来测试它的准确性:
int main() {
double dbl;
float sng;
for (int i = 0; i < 100; i++) {
double increment = std::pow(10, -i);
dbl = 0;
while (dbl < 1) {
dbl += increment;
sng = dbl;
double check = (double)sng / dbl;
if (check != 1) {
if (check < 0.9 || check > 1.11111) {
std::cout << "Fail at N = " << i;
goto stop;
}
}
}
std::cout << "Checked " << i << "\n";
}
stop:
return 1;
}
intmain(){
双dbl;
浮动sng;
对于(int i=0;i<100;i++){
双增量=标准::功率(10,-i);
dbl=0;
而(dbl<1){
dbl+=增量;
sng=dbl;
双重检查=(双重)sng/dbl;
如果(检查!=1){
如果(检查<0.9 | |检查>1.11111){
std::cout您想了解哪些硬件?并非所有硬件平台都使用相同的浮点格式。我假设IEEE-754单精度用于浮点
,因为您说系统是x86处理器。如果我正确理解您的规范,满足要求的最大N是44(如果支持非规范化),38如果不支持非规范化(即FPU在齐平归零模式下运行)。根据您的编译器,您可能需要一个编译器开关,例如/fp:strict
,以打开非规范化支持。该死!这比我预期的要多,我的程序现在为N=10。我想我还是把它关了吧。@njuffa您是如何得出这些数字的?您介意提供一个快速的解释(评论或回答,随您的喜好而定)吗@基本最小IEEE-754binary32
nonormal:2**-149~=10**-44.85。最小IEEE-754binary32
normal:2**-126~=10**-37.93