-
> Math (21.11.2008 10:19:11) [11]
Извиняюсь, был неправ, об этом речь не стояла.
-
пользуй Decimal.
18 знаков до запятой, 10 после.
его нет в дельфи, но можешь импортировать из oleaut32.dll.
функции типа VarDecSub и пр. (см. MSDN).
не скажу, что они медленные, но медленне вещ. чисел, это точно.
но есть достоинство - это точные типы, можно сравнивать равенством без эпсилона.
-
> Math (21.11.08 09:32) [6]
> Нет. Там очень большие с очень малыми складываются.
Я так и думал.
Это опять же говорит просто о неправильно организованном алгоритме, не учитывающем то, что выполняться он будет на реальных ЭВМ, а не на теоретических.
Впрочем, поведение реальных ЭВМ в данном вопросе так же очень подробно описано в учебниках, так что это вполне можно причислить к теории, которую необходимо подучить.
Здесь уже предложен вариант - учитывать эти числа раздельно. Или порядок операций поменять, чтобы разномасштабные числа не складывались.
-
> тимохов (21.11.08 12:42) [21]
> пользуй Decimal.
> 18 знаков до запятой, 10 после.
Не факт, что автору этого хватит, хватит сегодня - не хватит завтра.
Тут подход менять явно надо.
-
> тимохов (21.11.2008 12:42:21) [21]
По крайней мере для БД поддержано и Number(38) - оно же Decimal, по скорости не мерял.
-
128-XMM регистр - это не тоже самое, что 128-разрядное число
-
> icWasya (21.11.2008 13:36:25) [25]
Врядли оно поддерживает вещественные.
-
>oxffff © (21.11.08 10:34) [14]
>У меня то есть.
>RTFM
>AMD64 Architecture Programmer’s Manual Volume 4: 128-Bit Media Instructions
Ну и почитай что там написано -
Операции с двумя упакованными Double
Операции с четырьмя упакованными Single
..
И нигде нет 128-bit float
А лучше посмотри Volume 1
- Figure 4-14. 128-Bit Media Data Types
на странице 150
-
> icWasya © (21.11.08 14:29) [27]
О радует, что такой внимательный.
Я уже прочитал.
-
> icWasya (21.11.2008 14:29:27) [27]
Что такое упакованые Double и Single
-
"Целые числа созданы богом, все остальное – творение человека" (С) Кронекер
-
-
> Что такое упакованые Double и Single
Упакованные - это когда в один регистр запихнули несколько чисел одного типа. В 128битном регистре может уместиться 4 числа single или 2 double
-
> Math (21.11.08 09:32) [6]
> очень большие с очень малыми складываются.
> В результате эта малость теряется, как будто её нет вообще
Это хорошо известная проблема. Не менее хорошо известно и то, что увеличение разрядности здесь помогает мало, или не помогает вообще. Зато помогает реорганизация вычислений. Вот простейший пример.
Если написать так:
Р := Б + м1 + м2 + м3....
(где Р - результат, Б - большое число, мХ - малые числа),
то получим Р = Б.
А если написать так:
Р := (м1 + м2 + м3.... ) + Б
то получим Р <> Б.
Подобных приемов существует немало, и в том числе - перевод задачи в безразмерный вид с таких масштабированием, чтобы этой проблемы избежать совсем.