当前位置:  开发笔记 > 编程语言 > 正文

如何在特定机器上找到尾数长度?

如何解决《如何在特定机器上找到尾数长度?》经验,为你挑选了1个好方法。

我想在特定的计算机上找到尾数位数和单位四舍五入.我对这些是什么有所了解,不知道如何找到它们 - 虽然我知道它们可能因计算机而异.

我需要这个数字才能执行数值分析的某些方面,比如分析错误.

我现在想的是我可以写一个小的c ++程序来缓慢增加一个数字,直到溢出发生,但我不确定使用什么类型的数字.

我是在正确的轨道上吗?究竟如何计算这个呢?



1> paxdiablo..:

我认为无论你使用什么语言都会指定如何存储浮点数.我知道Java通过使用特定的IEEE标准(754,我认为)来做到这一点.

如果没有指定,我认为您可以通过添加0.5到1进行自己的检查,以查看实际数字是否发生变化.如果是,则添加0.25到1,0.125到1,依此类推,直到数字不变,如:

float a = 1;
float b = 0.5;
int bits = 0;
while (a + b != a) {
    bits = bits + 1;
    b = b / 2;
}

如果您只有3个尾数位,那么1 + 1/16将等于1.

然后你已经用尽了你的尾数位.

您实际上可能需要基数为2而不是1,因为IEEE754在开始时使用隐含的"1+".

编辑:

看起来上述方法可能存在一些问题,因为它为明显具有4字节浮点数的系统提供了63位.

不管是与中间结果做(I怀疑它因为具有显式转换相同的代码[ while (((float)(a + b) != (float)(a))]具有类似的问题)或(更可能的是,我相信)的单位值的可能性a可以与更靠近小数位来表示b通过调节指数,我还不知道.

目前,最好依赖我上面提到的语言信息,例如使用IEEE754(如果有这些信息).

我会将有问题的代码留作警察玩家的陷阱.也许有一个有更多浮点知识的人,然后我可以留下一个说明,解释为什么它行为奇怪(没有猜想,请:-).

编辑2:

这段代码通过确保中间体存储在浮点数中来修复它.事实证明乔纳森莱弗勒是对的 - 这是中间结果.

#include 
#include 

int main(void) {
    float a = 1;
    float b = 0.5;
    float c = a + b;
    int bits = 1;
    while (c != a) {
        bits = bits + 1;
        b = b / 2;
        c = a + b;
    }
    printf("%d\n",FLT_MANT_DIG);
    printf("%d\n",bits);
    return 0;

}

此代码输出(24,24)以显示计算的值与头文件中的值匹配.

虽然用C语言编写,但它应该适用于任何语言(特别是那些信息在标题中不可用或者在语言文档中指定的语言).我只在C中测试过,因为Eclipse需要很长时间才能在我的Ubuntu盒子上启动:-).

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有