Всем привет!
Для меня тоже оказалась актуальна тема округления.
У меня для вас есть немного вкусненького.
Есть небольшая модификация алгоритма округления до любого
числа знаков после запятой:
double round( double val, unsigned signs ) //[1]
{
double p = pow( 10., signs );
return floor( val * p + .5 ) / p;
}
val — само число,
signs — количество знаков после запятой.
Исследуя, природу этой ошибки, меня посетила такая мысль.
Что не любое число может быть представлено в формате типа
double. Одним из этих чисел является 0.285, и то что мы
видим 0.285 — это не так. На самом деле число 0.285
представлено числом, близким к нему, это число
0.284(9) ( 9 в периоде ). В доказательство этому привожу
фрагмент кода:
После выполнения строки номер 4 переменная iv принимает значение,
как вы думаете, не 50, а 49!
В результате стал перед проблемой правильного округления.
Если у кого есть соображения по этому поводу, пожалуйста,
высказываейтесь, будет интересно узнать.
Примечание: В компиляторе Borland Pascal 7.0 округление,
вроде корректно со всеми числами. Может все дело в структуре
хранения чисел с плавающей запятой в C?