Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2009 10:26:22

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

dimabest
Я писал программы на PHP, JavaScript и C#. В этих языках -17 степени программиста не беспокоят.
Программиста такие вещи вообще-то даже удивлять не должны. Не то, что беспокоить :)
dimabest
бггг, искал-искал и не нашел ничего кроме decimal из стандартной библиотеки Питона
Теперь выяснилось, что вы и искать не умеете.

ЗЫ
Мда, куда катится мир…

ЗЫ2
Ну хоть повеселимся посреди недели :)



Офлайн

#2 Март 11, 2009 11:51:45

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

В версии 2.6 появился новый модуль http://docs.python.org/library/fractions.html Сделан на чистом питоне, думаю возможно подцепить его и в версии 2.5.

Подобный модуль fraction есть в либе mpmath http://code.google.com/p/mpmath

Еще есть CLNUM http://calcrpnpy.sourceforge.net/clnum.html

И SymPy -

>>> from sympy import *
>>> a = Rational(1,2)
>>> a
1/2
>>> a*2
1
По отзывам на форумах самый быстрый модуль - GMPY http://code.google.com/p/gmpy

“A C-coded Python extension module that wraps the GMP library to provide to Python code fast multiprecision arithmetic (integer, rational, and float), random number generation, advanced number-theoretical functions, and more.”



Отредактировано (Март 11, 2009 11:57:28)

Офлайн

#3 Март 11, 2009 14:52:02

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

dimabest
Я писал программы на PHP, JavaScript и C#. В этих языках -17 степени программиста не беспокоят.
<html>
<head>
<title>PHP Test</title>
<script>
window.alert('' + (0.1 + 0.2 - 0.3))
</script>
</head>

<body>
</body>
те саме що і в пітоні,



Офлайн

#4 Март 11, 2009 14:53:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

сложение/вычитание вещественных чисел

fraction - штука хорошая, бесспорно. Вот только если считаем рубли и копейки - rational arithmetic не подходит, нужны fixed point decimals.
И вот как раз быстрого хорошего decimal я не нашел. Может быть, тоже искать не умею?



Офлайн

#5 Март 11, 2009 14:59:10

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

То есть многие языки, если не большинство - считают по умолчанию так же, как и Python.
asv13
Четыре диалекта scheme - Ypsilon 0.9.6, Bigloo (3.1b), DrScheme 4.1.2, Gambit-C v4.3.2,
а также “J” 602a, REBOL, Factor, newlisp 10.0.2 - все выдали ответ 5.551115123125783e-17

CLISP 2.45 (- (+ 0.1 0.2) 0.3) = 0, но при этом (- (+ 0.1 0.4) 0.3) = 0.19999999

Отличился OpenLisp = -5.96046e-008
на x86 всі мови себе так поводять а результати трішки відрізняються один від іншого напевно через те що вираховування результату відбувається через якусь кількість проміжних змінних.
на ARM Python for Symbian видає правильний результат. Все залежить від процесора а не від мови.



Офлайн

#6 Март 11, 2009 16:35:27

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

crchemist
Так и есть, мои опыты это как раз показали. Языки очень разные, а результат один.

Андрей Светлов
Кроме cdecimal из песочницы, есть еще функции для обычного decimal в библиотеках

dmath http://code.google.com/p/dmath и
decimalfuncs http://pypi.python.org/pypi/decimalfuncs + еще либа AJDecimalMathAdditions

в основном добавили тригонометрические функции -
acos, asin, atan, atan2, ceil, cos, cosh, degrees, e, exp, floor, hypot, log, log10, pi, radians, sin, sinh, tan, and tanh

Насколько я понял вопрос со скоростью это не решает, особенно если эти функции и так не используются :)

Посмотрел на всякий случай GMPY

>>> import gmpy
>>> a = gmpy.mpf('0.1', 10)
>>> a
mpf('1.e-1')
>>> b = gmpy.mpf('0.2')
>>> c = gmpy.mpf('0.3')
>>> a + b - c
mpf('0.e0')
>>> gmpy.fdigits(a + b - c, 10, 0, 0, 1, 0)
'0.0'
>>> gmpy.fdigits(b - c, 10, 0, 0, 1, 0)
'-0.1'
похоже работает как и fraction - до decimal не дотягивает, нет поддержки NaN, inf и т.п.



Офлайн

#7 Март 11, 2009 17:30:04

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

Андрей Светлов
И вот как раз быстрого хорошего decimal я не нашел.
Если не сложно, поделитесь, пожалуйста: какие смотрели, что подразумеваете под хорошими, что для вас “быстро”?



Офлайн

#8 Март 11, 2009 20:21:33

Psixo
От:
Зарегистрирован: 2007-09-12
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

Лутц не написал….
Надо было начинать читать Лутца не с раздела по ООП :р

>>> 0.1+0.2-0.3
5.5511151231257827e-017

>>> "%2.2f" % (0.1+0.2-0.3)
'0.00'
Если это требуется для вывода. Если для вычислений, то использовать соответствующие модули.



Отредактировано (Март 11, 2009 20:27:43)

Офлайн

#9 Март 11, 2009 20:25:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

сложение/вычитание вещественных чисел

Хотел С extension (никак не Питон, стандартный decimal уже есть).
Внутреннее представление - конечного размера (32/64/128 бит). Бесконечные числа для меня интереса не представляют.
Быстро - это медленнее float (нет аппаратной поддержки), но сопоставимо с библиотеками эмуляции floating point.
Хорошее представление дает эта ссылка.
decNumber - хорошая спецификация и приличные реализации. Вот ее и хотел бы завернуть в Питон.



Офлайн

#10 Март 11, 2009 21:40:52

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

сложение/вычитание вещественных чисел

Какой у вас объем decimal-данных?

Кстати, а завернуть decNumber в DLL (.so) не пробовали?



Отредактировано (Март 11, 2009 21:52:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version