У меня есть функция, которая принимает float, я делаю некоторые вычисления с ними, и я хотел бы сохранить как можно больше точности в возвращаемом результате. Я читал, что когда вы умножаете два поплавка, вы удваиваете количество значимых цифр.Умножение поплавков и сохранение/получение точности с двойной точностью
Итак, когда два поплавка умножаются, например float e, f;
, и я делаю double g = e * f
, когда бит заканчивается?
В моем примере функция ниже, мне нужно кастинг, и если да, то где? Это находится в плотном внутреннем цикле, если я помещаю static_cast<double>(x)
вокруг каждой переменной a b c d
, где он используется, я получаю 5-10% замедления. Но я подозреваю, что мне не нужно бросать каждую переменную отдельно, и только в некоторых местах, если вообще? Или возвращение двойника здесь не дает мне никакой выгоды, и я могу просто вернуть поплавок?
double func(float a, float b, float c, float d) {
return (a - b) * c + (a - c) * b;
}
Вам нужен только один актер, так как другие операнды будут преобразованы для вас _ "если один из операндов двойной, другой операнд преобразуется в двойной" _ источник: http://en.cppreference.com/w/cpp/ language/operator_arithmetiC# Conversions Однако это все равно даст вам такое же замедление. Второй вопрос о возврате двойника зависит от того, что вы делаете с возвращенным результатом. –
Да, но в моем случае оба (все) операнда (кроме возвращаемого типа) - это поплавки? – Ela782
Вы можете получить лучшую производительность (и, тем не менее, лучшую точность), если вы используете 'double' всюду. Это экономит накладные расходы на конвертацию. – 5gon12eder