经过一个小时的尝试在我的代码中找到一个错误,我终于找到了原因.我试图在1f添加一个非常小的浮点数,但没有发生任何事情.在试图弄清楚为什么我发现将小浮点数加到0f时效果很好.
为什么会这样?这与"数量级"有关吗?这个问题有解决方法吗?
提前致谢.
编辑:
目前不能选择更改为双精度或小数.
因为单精度(32位)浮点值的精度大约是小数点后的7位数.这意味着您添加的值基本上为零,至少在添加时1
.然而,值本身可以毫不费力地存储在浮点数中,因为在这种情况下指数很小.但要成功添加它1
你必须使用较大数字的指数...然后零点后的数字在四舍五入中消失.
double
如果您需要更高的精度,可以使用.在性能方面,这不应该对今天的硬件和内存产生影响,通常也不会限制你必须考虑每个变量.
编辑:正如你所说,使用double
不是一种选择,你可以使用Kahan总和,正如akuhn在评论中指出的那样.
另一种选择可能是以双精度执行中间计算,然后float
再次投射.但是,这只会在有更多操作时帮助,而不仅仅是向较大的数字添加一个非常小的数字.
浮点运算