我需要有一些浮动分区,必须是准确的,像他们的双倍版本。我可以更改除法值-它表示一个映射,我可以对其进行偏移-以纠正最终的浮点错误。
为了纠正错误,我使用以下代码:
do
{
float fValue = float(x) / 1024.f;
double oldFValue = fValue;
double dValue = double(x) / 1024.0;
if(oldFValue != dValue)
{
x += 1;
}
else
{
break;
}
}while(1);有了这段代码,
x = 11 我在调试器(Visual Studio 2010)中有:
fValue = 0.010742188
oldFValue = 0.010742187500000000你能解释一下为什么双精度值不同于浮点值吗?这是调试器问题还是浮点转换问题?我问这个是因为:
if(oldFValue != dValue)从来都不是真的,尽管它应该是真的。我应该用其他方式比较浮点值和双精度值吗?我需要浮点除法的结果与双除法的结果完全相同。
发布于 2012-02-05 19:00:13
发布于 2012-02-05 19:07:37
你对single precision float了解多少?
它被存储为<sign><exponent><mantis>。您可以将最终数字写为:
(sign ? 1 : -1) * 0.1<mantis> * 2^(expontent - 127)如你所见,number总是以数字>1和二进制小数的形式存储。不幸的是,像0.1 dec这样的数字是二进制周期的,所以用float不能得到确切的结果。
您可以尝试使用以下命令:if(oldFValue != (float)dValue),如果不起作用,您也可以尝试:
if(oldFValue*32 != (float)dValue*32)这将导致:
mantis >> 5
expontent += 5这可能会消除您的错误(尝试1(奇怪,但在某些情况下可能有效),2,4,8,16...,2^n)。
编辑:明确读取Johnsywebs link
发布于 2012-02-05 19:47:20
11 / 1024在float和double中都完全可以表示。所以当然是oldFValue == dValue。
https://stackoverflow.com/questions/9148656
复制相似问题