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-754
binary32
nonormal:2**-149~=10**-44.85。最小IEEE-754
binary32
normal:2**-126~=10**-37.93