Страница 2 из 2

Re: Странное поведение Real

Добавлено: 02.11.2010 22:04:50
Иван Шихалев
Max Rusov писал(а):в x64 Extended вообще не поддерживается

Откуда инфа?

Re: Странное поведение Real

Добавлено: 03.11.2010 10:46:11
Max Rusov
Иван Шихалев писал(а):Откуда инфа?

viewtopic.php?p=39785#p39785

Re: Странное поведение Real

Добавлено: 03.11.2010 11:59:37
Jargar
Max Rusov писал(а):Более того, в x64 Extended вообще не поддерживается,


Но сопроцессор можна использовать

Помимо увеличенной возможности адресации 64-х разрядные процессоры предлагают новые вычислительные возможности в виде новых регистров и команд. Также накладываются дополнительные ограничения и соглашения. К примеру, рассматривая x86-64: математический сопроцессор считается устаревшим. Его использование не поощряется, хотя и технически возможно. Вместо сопроцессора можно использовать 64-х разрядные регистры или SSE. Имеются более строгие требования к выравниванию данных. Особенно на стеке. Модель вызова - только одна. Ключевые слова типа stdcall, register и т.п. игнорируются. По этим трём причинам (сопроцессор, выравнивание + передача вещественных чисел в SSE-регистрах), Extended (10 байт, родной для мат-сопроцессора) в мире x64 становится очень уж неудобным. Возможно, он будет как-то изменён в грядущей Delphi x64 (либо приравняют к Double или Single, как это делает Free Pascal, либо пометят как deprecated, либо оставят как есть, но работа с ним может быть не оптимальной). x86-64 даёт вам 16 64-х разрядных регистров и 16 128-ми разрядных XMM-регистров (для вещественных чисел). Для сравнения: у x86-32 есть только 8 32-х разрядных регистров (если я правильно сосчитал), остальное - это сопроцессор (8 80-т битных регистра) и расширения. Т.е. x86-64 практически удваивает набор регистров, разве что регистры для вещественных чисел имеют уменьшенную до Double размерность. Напомню, сам сопроцессор никуда не уходит, но его использование не поощряется. Сопроцессор также не участвует в единственной для x64 модели вызова.


http://www.gunsmoker.ru/2010/11/64-windows.html

Re: Странное поведение Real

Добавлено: 03.11.2010 20:03:23
informat
Почему то ни кто не спросил, а какую задачу должна решать программа.

Может быть нужно совсем не так делать.
Например, ответ нужен не в десятичных дробях, а в обыкновенных.

Re: Странное поведение Real

Добавлено: 04.11.2010 00:18:51
Timid
2 lillgrinn,
Вы правы и неправы одновременно, создавая указанный код.

Первая проблема, которую Вы не заметили - это ситуация "минус нуля", которая всегда существует при наращивании значения отрицательного числа.
Формально -0 не равен +0. И лог Вам это явно показывает. Попробуйте "мотать" цикл в обратную сторону и посмотрите на листинг.

Вторая проблема - Вы составили цикл с фиксированным шагом, зачем Вы использовали переменную с плавающей запятой в качестве условного "счетчика цикла"? Гораздо вернее установить X целым, а в выражениях делить на 10.

Третья проблема - проблема плавающей точки, вернее, степени, выражаемой в типе реал 7-ю (кажется) битами. Двоичное представление 0.2 = 0.00110011, далее нужно его перевести в формат хранения real и т.п.

Но главное, согласно http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой, для правильной отработки операции сравнения с нулем, необходимо, чтобы библиотека вычислений устанавливала специальный флаг - "Ноль" в результате операции. Видимо, библиотека софтварной эмуляции для типа real это не делает. А вот сопроцессор, работая с extended - делает :)