我正在编写一段代码,我必须将其从double转换为float值。我正在使用boost :: numeric_cast进行此转换,这将提醒我任何溢出/下溢。但是我也有兴趣知道这种转换是否会导致一些精确损失。
例如
double source = 1988.1012;
float dest = numeric_cast<float>(source);
生成具有值1988.1
的dest有什么方法可以检测到这种精确损失/舍入
答案 0 :(得分:11)
您可以将浮动投射回一个双精度数并将此双精度数与原始数据进行比较 - 这可以为您提供关于是否存在精度损失的公平指示。
答案 1 :(得分:9)
float dest = numeric_cast<float>(source);
double residual = source - numeric_cast<double>(dest);
因此,residual
包含您正在寻找的“损失”。
答案 2 :(得分:1)
查看single precision和double precision浮点数的这些文章。首先,浮点数的指数为8位,双数位为11位。因此,如你所提到的那样,任何大于10 ^ 127或小于10 ^ -126的大小都将是溢出。对于float,对于数字的实际数字,您有23位,而对于double,则为52位。很明显,对于double来说,你有更多的精度数字比浮点数多。
假设你有一个像:1.1123。此数字实际上可能不会编码为1.1123,因为浮点数中的数字实际上用作分数。例如,如果尾数中的位是11001,那么该值将由1(隐式)+ 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 *组成1/32 + 0 *(64 + 128 + ...)。因此,除非您能够以确切数字的方式添加这些分数,否则无法编码确切的值。这很少见。因此,几乎总会有精确损失。
答案 3 :(得分:1)
根据戴夫的回答,你将会有一定程度的精确度损失。但是,如果您想要专注于量化它并在超过一定数量时引发异常,则必须打开浮点数本身并解析尾数&amp;指数,然后做一些分析,以确定你是否超出了容忍度。
但是,好消息是,通常标准IEEE浮点浮点数。 : - )