проблема в сравнении функции std :: max () с реализацией с фиксированной запятой - PullRequest
0 голосов
/ 29 января 2020

Существует ли какая-либо стандартная функция, которая может помочь мне сравнить max() или min() между двумя значениями с плавающей запятой?

Я написал реализацию с фиксированной запятой для этой функции min() и max() от типа q0s32 до q32s0 (33 типа).

Но я хочу проверить потерю точности моей функции с помощью функций std:min() и std::max(). Но результаты не очень хороши для функций std.

Я пытался таким образом, но это не сработало для меня, так как результат не соответствует ожиданиям.

Код:

float num1 = 4.5000000054f;
float num2 = 4.5000000057f;

float resf = std::max(num1,num2);
printf("Result is :%20.15f\n",resf);
printf("num1 :%20.15f and num2 :%20.15f\n",num1,num2);

Выход:

Result is :   4.500000000000000
num1 :   4.500000000000000 and num2 :   4.500000000000000

1 Ответ

2 голосов
/ 29 января 2020

Большинство реализаций c ++ используют стандарт IEEE 754 для арифметики с плавающей запятой c. Здесь - некоторая полезная информация об этой проблеме

В IEEE 754 float - 32-разрядное число с плавающей запятой одинарной точности (1 бит для знака, 8 бит для экспонента, и 23 * для значения), то есть с плавающей запятой имеет 7 десятичных цифр точности.

В IEEE 754 double - это 64-битное число с плавающей запятой двойной точности (1 бит для знака, 11 бит для показателя степени и 52 * бит для значения), то есть double имеет 15 десятичных цифр точности.

Вам необходимо использовать double вместо этого, чтобы получить желаемые результаты.

...