[Comm] g++ и неточности с плавающей точкой
Michael Pozhidaev
=?iso-8859-1?q?msp_=CE=C1_altlinux=2Eru?=
Вт Апр 8 17:43:19 MSD 2008
Здравствуйте, Sergey Vlasov!
> В архитектуре x86 регистры сопроцессора i387, используемые при
> операциях с плавающей точкой, имеют разрядность 80 бит (что
> соответствует типу long double). Если производятся вычисления с типом
> double, компилятор в зависимости от опций оптимизации может не
> сохранять промежуточные значения в памяти (что привело бы к их
> округлению до точности, обеспечиваемой 64-разрядным типом double), а
> брать их из регистров сопроцессора (с сохранением 80-разрядной
> точности); возможно, как раз это и является причиной изменения
> результатов при смене флагов оптимизации. У gcc есть опция
> -ffloat-store, включение которой заставляет gcc сохранять все
О, просто блестящий совет! :)
Да, включение -ffloat-store выровняло вычисления. Сейчас это важнее,
чем экстремальная скорость.
Уже собирался предпринимать поиски ошибок,
но теперь порядок. По крайней мере понятно, что происходит, и насколько адекватные результаты получаются.
Большое спасибо.
--
С уважением и наилучшими пожеланиями, Михаил Пожидаев. E-mail: msp на altlinux.ru.
Томский государственный университет. Факультет информатики. http://www.csd.tsu.ru
AltLinux Team. http://www.altlinux.ru
Подробная информация о списке рассылки community