我有一個功能,如:精度損失?
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