У меня есть функция, как:Потеря точности?
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))
РЕДАКТИРОВАНИЕ
Извините, у меня было t он ошибается здесь.
Но я имел в виду, что это 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. Что случилось, когда вы попробовали? –
No ............. –
Все эти выражения приведут к такому же результату, без потери точности. – Paraboloid87