LINUX.ORG.RU

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


0

3

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

есть такие?

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

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

Я прочитал.

Тебе надо было сразу указать для чего тебе это нужно. Хотя, всё равно питоновские мат-либы внутрях на сях написаны, так что шансы что какой-нить scipy/numpy/etc прокатит велики.

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

У меня заряд и масса электрона (кулоны(е-16) и килограммы (е-31) соотв.) и энергия (~100 eV (е-14)) в джоулях в формулах фигурируют. Я думал может просто перейти к другим единицам. Но походу дела возникла другая идея. Как я написал выше, возможно количество итераций будет не такое уж большое и дельту можно выкинуть никто и не заметит. Так что может зря парюсь вообще. Но это надо ещё прикинуть. Завтра займусь. Спасибо за советы тем не менее.

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

Да, спасибо, надо будет глянуть. А то я что-то уже давно на питоне не писал ничего. Всё плюсики да плюсики.

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

Но у меня задача численная

Уже несколько человек высказали предположение, что ОП решает некорректную задачу. В правильно обезразмеренной системе никогда не придётся работать с таким диапазоном значений, только если не моделировать влияние одного протона на Луну.

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

Так и знал. Нужно ввести безразмерные величины: координаты, время, энергию и т.д. Тогда, глядишь, и флоата хватит.

Вот ведь, на ассемблере программируют, а азов не знают.

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

В численной задаче всегда есть некие заданные величины. Нужно ввести систему единиц, в которых их значение будет порядка единицы. После чего, пользуясь любыми уравнениями, которые есть в задаче, получить коэффициенты для перевода других величин в эту систему единиц. В идеале вообще все величины будут иметь порядок единицы. Если, конечно,

не моделировать влияние одного протона на Луну

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

каким нибудь чудом на типах сделает что-нить вроде FixedPrec 500

module Data.Number.Fixed(
    Fixed,
-   Epsilon, Eps1, EpsDiv10, Prec10, Prec50, PrecPlus20,
+   Epsilon(..), Eps1, EpsDiv10, Prec10, Prec50, PrecPlus20,
module Data.Number.Fixed.TypeLevel where

import Data.Number.Fixed ( Fixed, Epsilon(..) )
import Data.TypeLevel.Num ( Nat, toNum )

type FixedPrec n = Fixed (Prec n)

newtype Prec n = Prec { fromPrec :: n }

instance Nat n => Epsilon (Prec n) where
  eps = (1 /) . (10 ^) . toNum . fromPrec
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> :t eps (undefined :: Prec D500)
eps (undefined :: Prec D500) :: Rational
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> eps (undefined :: Prec D500)
1 % 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> (1.0 :: FixedPrec D49) + 1e-50 /= 1.0
False
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> (1.0 :: FixedPrec D50) + 1e-50 /= 1.0
True
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> (1.0 :: FixedPrec D5000) + 1e-50 /= 1.0
True
*Data.Number.Fixed.TypeLevel Data.TypeLevel.Num.Aliases> 

только Data.Number.Fixed это рациональные числа. Есть биндинг к mpfr, но там пугают какими-то проблемами с GHC.

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

только Data.Number.Fixed это рациональные числа

Хотя, Rational это пара Integer, а Integer работает за счёт GMP, и «MPFR is based on the GMP multiple-precision library».

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

Если поставленная задача корректна, то numpy точно не подходит, а scipy надо смотреть.

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

а вот перейти к другим единицам это как раз таки верное решение, т.е. во-первых в СГС, во вторых всё, что можно со степенями вынести и применять лишь вконце вычисления.

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

за исключением некорректной аналогии

Там как раз 50 порядков, я на калькуляторе считал!

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

Интересно... не задумывался об этом. У меня тоже численная задача кое-какая... и да, наверное мне тоже надо как-то обезразмерить величины. Подумаю об этом.

просто мне о таком почему-то никто не подсказывал... а я сам, тупой, не догадался. :)

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

а почему вот именно СГС?

опишу вкратце, что мне нужно посчитать... 4*m^2*e^2/(h^4 * q^4) (и ещё умножить на какую-то штуку, это уже не важно, там всё обезразмерено)

соответственно, m - масса электрона, e - заряд электрона, h - постоянная Планка, q - волновое число (модуль волнового вектора вроде бы...).

Волновое число неизвестно, считается по формуле E/hc (h с чертой), E - энергия известна (задаётся в электронвольтах), h - постоянная Дирака, c - скорость света в вакууме.

В каких единицах измерения мне считать? Если энергия задаётся в электронвольтах, соответственно и постоянную Планка/Дирака задавать в них... это понятно. Скорость света в м/с? или в чём-то другом?

Заряд электрона в кулонах, или в чём?.. Ну а массу я так прикинул. что не в килограммах, а в электрон-вольтах? или всё-таки в килограммах?

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

По электроноптике задача. Есть система линз, надо найти куда электроны летят.

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

Если энергия задаётся в электронвольтах, соответственно и постоянную Планка/Дирака задавать в них... это понятно.

Если энергия в электрон-вольтах близка к единице, то можно не заморачиваться и оставить их. Если же характерная энергия порядка МэВ или мэВ, то лучше считать всё в них.

Ну а массу я так прикинул. что не в килограммах, а в электрон-вольтах?

Если в задаче нет аннигиляции, то масса в электрон-вольтах - плохая идея. Лучше взять массу просто в массах частиц, как правило.

Скорость света в м/с?

Если заданы величины массы и энергии, то скорость уже нужно выражать через них.

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

Также, если поискать, можно найти уже готовые системы единиц для конкретных задач. Есть всякие там «металлические системы единиц», где энергия Ферми и масса атома имеют значения порядка единицы и тому подобные.

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

а почему вот именно СГС?

в электродинамике зачастую получаются более приятные вычисления изкоробки. Но опять же он задачи к задаче, идеальный вариант нормализовать вычисления, таким образом, чтобы результаты были в районе 1, и потом восстанавливать норм величины. Ну и да dmfd отвечает лучше меня :)

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

а давайте вы не будете притворяться упоротым например. понятно же что нужен longlong...longlongint. но в жизни все равно будет так что считать надо будет допиливать готовые библиотеки.

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

(type-of (expt 10 -50)) => RATIO

Ну так естественно. Ratio и позволит нам рациональную арифметику произвольной точности. A {short,single,double,long}-float ложатся на нативные для процессора типы с плавающей точкой. Они будут одинаковыми для всех языков программирования на конкретном компьютере, и, как я понимаю не дают требуемой точности.

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

Ratio и позволит нам рациональную арифметику произвольной точности.

Пожалуй, да. Осталось только выбрать язык с нормальной поддержкой рациональных чисел (можно начать с С и С++).

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

а давайте вы не будете притворяться упоротым например. понятно же что нужен longlong...longlongint. но в жизни все равно будет так что считать надо будет допиливать готовые библиотеки.

1. ТС-у нужен не int, а fp. Как этот fp реализован - дело тридесятое.
2. В жизни ты самостоятельно сможешь написать только кусок говна. Потому что не-говно в этой области потребует многих тысяч человекочасов, в которые входит раскуривание матана специально обученными гиками, написание специализированных алгоритмов для разных длин аргументов, написание бенчмарков для определения точек переключения между алгоритмами, написание и пефоманс-тюнинг ассемблерных реализаций наиболее горячих циклов, написание тестов для тонн получившегося кода. Твой работодатель разорится раньше, чем ты доведешь «свою либу» до сколько-нибудь удовлетворительного качества.
3. Если ты не можешь в случае ясно определенного (в школьном курсе арифметики) интерфейса обойтись без допилки готовых библиотек, то у тебя просто NIH головного мозга. Попробуй вместо велосипидорства и допилки сфокусироваться на создании business value.

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