Пытаюсь освоить Си.
К сожалению, учили нас толькона Паскале и только на продуктах Борланд (б-р-р-р...), поэтому мозг отравлен. Никак не могу выбраться за пределы Паскалевских рамок.
Книги смотрел разные.
Со скрипом идёт K&R.
Стивен Прата. Его хвалили, но достать практически негде.
Сейчас вот Стефан Кочан на вооружении. На ЛОРе проскальзывало, что это наподобие Праты.
Это всё лирика.
Теперь по теме. В некоторых книгах (не во всех) обращают внимание на то, что числа с плавающей точкой не имеют точного машинного представления. Это действительно так.
Но ни в одной книге мне не попадалось никаких рекомендаций на этот случай.
В одной здешней теме я приводил такой пример из книги:
Код: Выделить всё
var a, b: real; n: byte; begin a:=0.2; b:=0; for n:=1 to 50 do b:=b+a; Writeln('a=', a:20:18, '; b= ', b:20:18) end.
Очевидно, что результирующим значением переменной b должно быть
ax50=10
Однако, результатом работы этого кода является
a=0.200000000000045475;
b=9.999999999927240420
Заметьте, что хотя реальное значение переменной a больше(!), чем задано в коде, результирующее значение переменной b получилось меньше(!), чем ожидалось.
Приведенные здесь цифры - это результат работы кода, скомпилированного в Borland Pascal.
FreePascal даёт другой результат
Код: Выделить всё
a= 0.200000000000000;
b= 10.000000000000000
Отсюда делаю два вывода:
1. Результат зависит от кучи факторов, в частности, от компилятора.
2. Получение результата с хорошей точностью в принципе возможно.
Я попробовал переписать данный код на Си.
Более-менее точные цифры получились при использовании long double.
Но всё равно b получилось меньше 10.
Я вот думаю, если Pascal позволяет хорошую точность, то и в Си, наверное, можно.
Вопрос: Как при использовании Си получить высокую точность? Такую же как даёт FreePascal для приведенного примера?
Какие есть способы (методы, правила, приёмы) повышения точности для Си вообще и под Linux, в частности?
Прошу опытных сишников поделиться знанием.
Также буду благодарен за любые рекомендации касательно статей, литературы и пр. по данной теме.