Портал Python-программистов

Форумы сайта python.com.ua

Вы не зашли.

Объявление

Открыт официальный канал портала на pythonua@conference.jabber.ru читать подробности
  • > Python
  • > Глюк с комплексными числами [RSS Feed]

#1 2007-10-09 21:35:03

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Глюк с комплексными числами

Пишу сейчас для работы скрипт на питоне, который должен обрабатывать данные. И наткнулся на такой глюк.

Есть кусок кода:

Код: :python:

# -*- coding: utf-8 -*-
 
import cmath
import numpy
import math
 
count = 64
 
dt = 25.0e-12
df = 1.0 / (count * dt)
 
r = 0.85
c = 3.0e8
 
i = complex (0.0, 1.0)
 
e = [cmath.exp (i * r * c * 2.0 * math.pi * df * n) for n in xrange (count) ]
 
e_abs = [abs (val) for val in e]
 
print e_abs

Смотрим на результат и медленно офигеваем:


[1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 1.0000000000000002, 1.0, 1.0, 1.0, 1.0, 1.4161689365379793e+019, 1.5577858301917772e+019, 1.6994027238455753e+019, 1.8410196174993732e+019, 1.9826365111531713e+019, 2.1242534048069689e+019, 2.265870298460767e+019, 2.4074871921145647e+019, 2.5491040857683628e+019, 2.6907209794221605e+019, 2.8323378730759586e+019, 2.9739547667297563e+019, 3.1155716603835544e+019, 3.257188554037352e+019, 3.3988054476911505e+019, 3.5404223413449486e+019, 3.6820392349987463e+019, 3.8236561286525444e+019, 3.9652730223063425e+019, 4.1068899159601398e+019, 4.2485068096139379e+019, 4.390123703267736e+019, 4.5317405969215341e+019, 4.6733574905753313e+019, 4.8149743842291294e+019, 4.9565912778829275e+019, 5.0982081715367256e+019, 5.2398250651905229e+019, 5.381441958844321e+019, 5.5230588524981191e+019, 5.6646757461519172e+019, 5.8062926398057144e+019, 5.9479095334595125e+019, 6.0895264271133106e+019, 6.2311433207671087e+019, 6.372760214420906e+019, 6.5143771080747041e+019, 6.6559940017285022e+019, 6.7976108953823011e+019, 6.9392277890360992e+019, 7.0808446826898973e+019, 7.2224615763436945e+019, 7.3640784699974926e+019, 7.5056953636512907e+019, 7.6473122573050888e+019, 7.7889291509588869e+019, 7.930546044612685e+019, 8.0721629382664815e+019, 8.2137798319202796e+019, 8.3553967255740776e+019, 8.4970136192278757e+019, 8.6386305128816738e+019, 8.7802474065354719e+019, 8.92186430018927e+019]


Модуль чисто мнимого числа скачком становится вместо 1.0 каким-то здоровенным числом, которое еще линейно растет:

http://i15.photobucket.com/albums/a375/Jenyay/Screenshots/complexbug.png

Теперь заменяем модуль cmath на numpy:

Код: :python:

# -*- coding: utf-8 -*-
 
import cmath
import numpy
import math
 
count = 64
 
dt = 25.0e-12
df = 1.0 / (count * dt)
 
r = 0.85
c = 3.0e8
 
i = complex (0.0, 1.0)
 
e = [numpy.exp (i * r * c * 2.0 * math.pi * df * n) for n in xrange (count) ]
 
e_abs = [abs (val) for val in e]

И получаем вполне нормальный результат.

[1.0, 0.99999999999999989, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 0.99999999999999989, 1.0, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 1.0, 1.0, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989, 0.99999999999999989, 1.0, 1.0, 1.0, 1.0, 1.0, 0.99999999999999989]


PS. Все это проверял на Python 2.5, WinXP + SP2.

PPS. А как на этом форуме можно раскрасить питоновский код?

Отредактированно Jenyay (2007-10-10 08:56:35)


http://jenyay.net - софт, исходники и фото

Неактивен

 

#2 2007-10-09 22:37:47

bialix
Команда
Откуда: Запорожье
Зарегистрирован: 2006-07-13
Сообщений: 399
Рейтинг :   14 
Профиль  Вебсайт

Re: Глюк с комплексными числами

раскрасить: code:python


--
В мире достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет. (Блез Паскаль)

Неактивен

 

#3 2007-10-10 08:57:07

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

Спасибо, раскрасил.


http://jenyay.net - софт, исходники и фото

Неактивен

 

#4 2007-10-10 09:49:36

bialix
Команда
Откуда: Запорожье
Зарегистрирован: 2006-07-13
Сообщений: 399
Рейтинг :   14 
Профиль  Вебсайт

Re: Глюк с комплексными числами

в багтрекере питона не искали упоминание про такой глюк? может он уже известен?


--
В мире достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет. (Блез Паскаль)

Неактивен

 

#5 2007-10-10 12:50:52

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

Нет, еще не смотрел. Сегодня вечером поищу. Заодно можно попробовать питон 2.5.1 поставить.


http://jenyay.net - софт, исходники и фото

Неактивен

 

#6 2007-10-10 21:42:43

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

В питоне 2.5.1 ничего не изменилось, и в багтрекере такого бага не нашел. В


http://jenyay.net - софт, исходники и фото

Неактивен

 

#7 2007-10-11 02:44:15

bialix
Команда
Откуда: Запорожье
Зарегистрирован: 2006-07-13
Сообщений: 399
Рейтинг :   14 
Профиль  Вебсайт

Re: Глюк с комплексными числами

а вы смотрели сами комплексные числа, их значения?


--
В мире достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет. (Блез Паскаль)

Неактивен

 

#8 2007-10-11 06:40:53

Striver
Питонер
Откуда: Байконур
Зарегистрирован: 2006-10-26
Сообщений: 71
Рейтинг :   
Профиль

Re: Глюк с комплексными числами

около 9.3e18 достигается предел точности типа float64:

Код: :python:

>>> x1=9.2e18j
>>> x2=9.3e18j
>>> cmath.exp(x1)
(0.8892436064235012+0.45743393887524936j)
>>> cmath.exp(x2)
(9.3e+018+9.3e+018j)

Если посчитать двоичный логарифм от 9.3e18, видно, что используются все 63 разряда плюс 1 на знак:

Код: :python:

>>> math.log(9.3e18)/math.log(2)
63.011936424193195

Так что это не глюк, а достижение предела точности. Дальше идет линейная зависимость, т.к. значимым оказывается только первый член ряда Тэйлора при вычислении функции. Видимо, модуль numpy либо использует большую разрядность, либо перед применением numpy.exp делает проверку на x.real==0.

А зачем Вам нужны такие огромные числа?

Отредактированно Striver (2007-10-11 06:56:00)

Неактивен

 

#9 2007-10-11 09:43:28

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

Сами числа еще не смотрел, пока руки не дошли. Надо будет действительно глянуть что там возвращает numpy. А вообще это для обработки сигналов. Там в формуле частота большая (гигагерцы), да еще и на скорость света умножается.


http://jenyay.net - софт, исходники и фото

Неактивен

 

#10 2007-10-11 09:58:28

bialix
Команда
Откуда: Запорожье
Зарегистрирован: 2006-07-13
Сообщений: 399
Рейтинг :   14 
Профиль  Вебсайт

Re: Глюк с комплексными числами

согласен про точность. именно это и пришло в голову когда начал смотреть на величину экспоненты.

Jenyay: у вас при вычислении экспоненты там куча констант. Попробуйте их немного переработать, чтобы уменьшить порядок чисел. Все равно на таких частотах единицы Герц никому не интересны.


--
В мире достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет. (Блез Паскаль)

Неактивен

 

#11 2007-10-11 11:33:15

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

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

Как запасной вариант посчитать сколько в скорости света укладывается 2*pi, потому что такое страшное произведение используется только в фазе.


http://jenyay.net - софт, исходники и фото

Неактивен

 

#12 2007-10-11 11:56:31

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

Проблема похоже отпала сама собой. Нашел скорее всего ошибку, и теперь на скорость света надо не умножать, а делить smile


http://jenyay.net - софт, исходники и фото

Неактивен

 

#13 2007-10-11 13:45:13

bialix
Команда
Откуда: Запорожье
Зарегистрирован: 2006-07-13
Сообщений: 399
Рейтинг :   14 
Профиль  Вебсайт

Re: Глюк с комплексными числами

м-да, с длиной волны вы все никак не подружитесь.


--
В мире достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет. (Блез Паскаль)

Неактивен

 

#14 2007-10-11 15:02:27

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

Ну не совсем. Мне эту формулу по телефону диктовали, не удивительно, что ошибся.


http://jenyay.net - софт, исходники и фото

Неактивен

 

#15 Вчера 16:46:36

ZAN
Питонер
Откуда: Беларусь, Минск
Зарегистрирован: 2007-06-10
Сообщений: 13
Рейтинг :   
Профиль

Re: Глюк с комплексными числами

Эх.. ну проявил бы смекалку - скорость света - единица, частота - в каких-нибудь обратных сантиметрах.. smile

Неактивен

 

#16 Вчера 20:59:01

Jenyay
Питонер
Откуда: Москва
Зарегистрирован: 2007-08-10
Сообщений: 28
Рейтинг :   
Профиль  Вебсайт

Re: Глюк с комплексными числами

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


http://jenyay.net - софт, исходники и фото

Неактивен

 
  • > Python
  • Глюк с комплексными числами [RSS Feed]

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Linux coutner