我有一个功能,如:精度损失?
double calc(double x);
难道我失去精度所有这些表述的:
double y1 = calc(1.0/3);
double y2 = calc(1.0/3.0);
这些是更准确:
double y3 = calc(static_cast<double>(1)/3)
double y4 = calc(static_cast<double>(1)/static_cast<double>(3))
编辑
对不起,我有他在这里错了数字。
但是,我的意思是说是1.0
解释为float
或double
并且总是这样或者它是否依赖于某些编译器标志?如果它是float
,那么1.0/3
也将是float
,然后才转换为double
。如果是这种情况,会导致精度损失,不是吗?
EDIT 2
我与g++
测试这一点,事实证明,如果程序与-fsingle-precision-constant
标志编译,你做丢失精度。
#include <iostream>
#include <limits>
#include <typeinfo>
long double calc(long double val)
{
return val;
}
int main() {
std::cout.precision(std::numeric_limits< long double >::max_digits10);
std::cout << calc(1.0/3.0) << std::endl;
std::cout << calc(static_cast<float>(1)/3) << std::endl;
std::cout << calc(static_cast<double>(1)/3) << std::endl;
std::cout << calc(static_cast<long double>(1)/3) << std::endl;
std::cout << typeid(1.0).name() << std::endl;
return 0;
}
的结果是,
0.333333343267440795898
0.333333343267440795898
0.33333333333333331483
0.333333333333333333342
f
所以,我决定用static_cast< long double >(1)/3
是在安全方面。
Dunno。当你尝试时发生了什么? –
否............. –
所有这些表达式都会导致相同的结果,完全没有精度损失。 – Paraboloid87