6

我在写一段代码,我必须将其从双精度值转换为浮点值。我正在使用boost :: numeric_cast来执行此转换,它会提醒我任何溢出/下溢。不过,我也有兴趣知道这种转换是否会导致某些精度损失。当从双精度转换为浮点时检测精度损失

例如

double source = 1988.1012; 
    float dest = numeric_cast<float>(source); 

主要生产DEST拥有价值1988.1

是否有任何可用的方式,我可以检测到这种精度损失/四舍五入

+7

在这种情况下,总会有*精确度损失。 – 2010-07-13 17:58:33

回答

11

你可以施放浮动回加倍并且将这个双倍与原始值进行比较 - 这应该给你一个关于是否失去精度的公平指示。

+4

比公平更好。它会告诉你,是否有任何信息丢失。 – 2010-07-13 18:44:57

9
float dest = numeric_cast<float>(source); 
double residual = source - numeric_cast<double>(dest); 

因此,residual包含您正在寻找的“损失”。

1

看看这些文章为single precisiondouble precision浮游物。首先,浮点数指数为8位,双数为11位。所以任何大于10^127或小于10^-126的数值都将成为你所说的溢出。对于浮点数,你有23位的数字的实际数字,52比特的双。很明显,你的双精度比浮点精度要高得多。

假设你有这样一个数字:1.1123。这个数字实际上可能不会被编码为1.1123,因为浮点数字中的数字被用来实际加起来作为分数。例如,如果尾数为11001,那么该值将由1(隐含)+ 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 *(64 + 128 + ...)。所以确切的值不能被编码,除非你可以将这些分数加起来,使其成为确切的数字。这很少见。因此,几乎总会有精确度损失。

+1

我可以建议指向经常提到的http://docs.sun.com/source/806-3568/ncg_goldberg.html吗? (我自己没有足够的代表来做) – 2010-07-13 18:30:15

1

按照Dave的回答,你将会有一定程度的精确度损失。但是,如果您想要集中精力量化它并在超出特定数字时引发异常,则必须自行打开浮点数并解析出指数的尾数,然后进行一些分析以确定您是否“已超出你的容忍度。

但是,好消息是,它的通常是标准的IEEE浮点浮点数。 :-)