LINUX.ORG.RU

язык с очень маленьким машинным нулём.


0

3

Нужен язык программирования, в котором 1.0 + 1e-50 != 1.0 Всякие питоновские 1/3 * 3/1 == 1 не интересуют. Интересно приемлемо точное сложение и умножение очень маленьких и очень больших чисел.

есть такие?

Тебе нужно, чтобы это было «вшито» в язык? Потому что сторонними библиотеками это во всех языках есть.

Deleted
()

Haskell же.

anonymous
()
Ответ на: комментарий от nanoolinux

но для моей задачи gmp покатить.

Тогда, как было сказано, почти любой язык. Можно и BCMath задействовать:

php > bcscale(2000);
php > echo bcdiv(1, bcmul(3, bcpow(10, 999)));
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

KRoN73 ★★★★★
()

ИМХО надо использовать математические пакеты типа Mathcad или Maple.

AlexCones ★★★
()
Ответ на: комментарий от nanoolinux

Плохие новости.

GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> (1.0 + 1e-50) /= 1.0
False

KblCb ★★★★★
()
Ответ на: комментарий от anonymous

потому, что gmp так используется для Integer хочется плавающую точку адекватную то использовать CReal или представление в виде дробей.

qnikst ★★★★★
()

афтар, тебе надо ты и напиши библиотеку функций. ибо раскрою тебе тайну: у fpu точность конечная.

тебе надо big integer c fixed point чтоб 180 бит было после запятой.

ckotinko ☆☆☆
()
Ответ на: комментарий от anonymous

Это же вероятно ghc внутренне реализует integer через gmp. Это не полноценный биндинг.

Это, вероятно, вы не знаете, что такое GMP. Floating-point арифметику реализует MPFR.

buddhist ★★★★★
()
Ответ на: комментарий от KblCb

ступил, но опять же можно

Prelude Data.Number.Fixed> (1.0::(Fixed (PrecPlus20 Prec50)))+(1e-50)/=1.0
True

а нужную точность на типах сделать.

qnikst ★★★★★
()

Таких машинных нулей в свободной продаже нет. Я не уверен, что они вообще есть, но если есть, то точно не для экспорта. Так что кроме эмуляции (как тут советуют) вариантов нет.

vvff
()

Нужен язык программирования, в котором 1.0 + 1e-50 != 1.0

Но зачем?

fat_angel ★★★★★
()
Ответ на: комментарий от buddhist

ну это ж ghci, в нормальном коде почти везде автовывод типа будет, кроме пары мест, ну и никто не мешает сделать:

type MyPrec= EpsDiv10 (PrecPlus20 (PrecPlus20 (PrecPlus20 Prec50)))

а щас придёт quasimoto и каким нибудь чудом на типах сделает что-нить вроде FixedPrec 500, который автоматом будет разворачиваться в нужный тип.

А для глупые типа меня могут воспользоваться TH для аналогичного результа.

Ещё есть BigFloat, в котором эмулируется мантисса нужного размера.

qnikst ★★★★★
()
Ответ на: комментарий от ckotinko

какие ваши доказательства, что я не писал на ассемблере и вообще пишу на жабе?

nanoolinux ★★★★
() автор топика
Ответ на: комментарий от rexadecimal

машинное epsilon - это ж не характеристика языка, а характеристика, простите, машины

Это характеристика конкретной реализации float-point. Машинным оно зовётся лишь по традиции.

Manhunt ★★★★★
()

это нужна бибилиотека с минимум 256(32байта)битными вещественными
а лучше 512(64байта)

ae1234 ★★
()
Ответ на: комментарий от vvff

Таких машинных нулей в свободной продаже нет.

«машинный» != «аппаратный»

KRoN73 ★★★★★
()
Ответ на: комментарий от AlexCones

Каждый велосипед имеет право на жизнь

Только до тех пор, пока его горе-автора на найдут коллеги по цеху, и не подвергнут жестокой, но заслуженной расправе.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Тебя это тоже касается? Или, как обычно поступают в таких случаях, сделаешь для себя исключение?

DeVliegendeHollander ★★
()

У меня калькулятор умеет (1/3)*3 = 1

Xenon ★★★
()
Ответ на: комментарий от nanoolinux

Что за задача такая? Может быть, она некорректная, и тебе нужна регуляризация или какие-нибудь там интервальные вычисления?

dave ★★★★★
()
Ответ на: комментарий от BattleCoder

Кстати, реально пробовал long double? У меня на gcc-4.7 он - тоже самое, что double. А вот __float128 - пашет. Выходит максимум, что можно получить:

double eps = 1e-19;
__float128 eps = 1e-34;
// для 1.0 + eps != 1.0

gag ★★★★★
()
Ответ на: комментарий от gag

Не помню... пробовал... точно не помню, сильно отличался, или нет...

А __float128, судя по названию - что-то явно компиляторно-зависимое. :)

BattleCoder ★★★★★
()

Интересно приемлемо точное сложение и умножение очень маленьких и очень больших чисел.

Так очень маленьких с очень маленькими или очень маленьких с очень большими?

В любом случае clisp с целыми бесконечного размера и коррекцией мантиссы. Например 100 + 0.01 => (10000 + 1) / 100.

То есть представить все числа умноженными на «приемлемую» степень 10. После всех операций делить.

vahtu
()
Ответ на: комментарий от true_admin

А так:

Всякие питоновские 1/3 * 3/1 == 1 не интересуют.

Подозреваю ты не дочитал.

Собственно питон штука хорошая, не спорю. Но у меня задача численная, хотелось бы на пару дней, а там как получится. А питон, боюсь, будет пару недель потеть.

nanoolinux ★★★★
() автор топика
Ответ на: комментарий от BattleCoder

У меня sizeof 8 и 12 байт, на счёт мантиссы не знаю.

Я тут на самом деле поразмышлял, наверное я вообще зря парюсь. При таком количестве итераций как у меня дельтой можно будет пренебречь наверное. Но я ещё завтра прикину, что бы уже точно знать, тогда за реализацию возьмусь.

nanoolinux ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.