我知道扩大转换是安全的,因为它们会导致no loss of data,但是精确度是否有实际增长,或者是否具有相同数量的重要数字?
例如,
#include <iostream>
#include <iomanip>
int main()
{
float i = 0.012530f;
std::cout << std::setw(20) << std::setprecision(7) << i << std::endl;
double ii = (double)i;
std::cout << std::setw(20) << std::setprecision(15) << ii << std::endl;
double j = 0.012530;
std::cout << std::setw(20) << std::setprecision(15) << j << std::endl;
}
生成输出
0.01253
0.012529999949039
0.01253
查看调试器中的变量会显示j
已四舍五入,因为浮点数不能完全代表原始数字,但它仍然是原始数字的精确近似值,而不是ii
。
i = 0.012530000
ii = 0.012529999949038029
j = 0.012529999999999999
为什么演员阵容不如直接作业精确?如果我加宽浮点数的精度,我可以只计算8位数的精确度吗?
答案 0 :(得分:3)
似乎问题的答案显而易见。由于double
比float
更精确,因此如果您直接指定double
,则会获得更准确的值,如果您通过float
则会失去精确度。
当你float i = 0.012530f;
float
时,float
得到的0.012530
与double j = 0.012530;
一样接近0.01253。至7位数,看起来像double
。
执行double
时,float
得到的double
与double
一样接近0.01253。
如果您将float
转换为{{1}},则{{1}}的{{1}}与{{1}}一样接近0.01253。
您无法将数字输出与不同的精度进行比较,以确定哪个更接近。例如,假设正确的数字是0.5,并且您有两个近似值,“0.5001”和“0.49”。显然,第一个更好。但是,如果您显示第一个带有5个十进制数字“0.5001”而第二个只显示一个十进制数字“0.5”,则第二个看起来更接近。你的第一个输出具有这种虚假,明显的精确度,因为它显示数字和幸运四舍五入。