我想在特定的计算机上找到尾数位数和单位四舍五入.我对这些是什么有所了解,不知道如何找到它们 - 虽然我知道它们可能因计算机而异.
我需要这个数字才能执行数值分析的某些方面,比如分析错误.
我现在想的是我可以写一个小的c ++程序来缓慢增加一个数字,直到溢出发生,但我不确定使用什么类型的数字.
我是在正确的轨道上吗?究竟如何计算这个呢?
我认为无论你使用什么语言都会指定如何存储浮点数.我知道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盒子上启动:-).