nJLyTo
Март 4, 2010 19:28:59
Требуется считать большое кол-во синусов, косинусов и т.д. Сам впервые сталкиваюсь с этим, поэтому хотелось бы услышать мнение опытных людей.
Zubchick
Март 4, 2010 19:59:26
услышать что? Как импортировать синус? Или как считать неподвижную точку? Вот у меня есть код на схиме по этому поводу xD
(define tolerance 0.00001)
(define (fixed-point f first-guess) ; f - функция
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
а если серьезно, то все просто, в бесконечном цикле считаем функцию до заданного предела точности.
Ferroman
Март 5, 2010 00:48:38
Не получается :(
>>> from __future__ import braces
SyntaxError: not a chance (<input>, line 2)
А вообще, поточнее бы вопрос.
boltayka
Март 5, 2010 05:56:17
Попробую впервые здесь не спросить, а ответить на вопрос, так что ногами не бить :-)
from math import sin, cos
for i in range(1, 100):
print 'number: '+str(i)
print 'sinus: '+str(sin(i))
print 'cosinus: '+str(cos(i))
nJLyTo
Март 5, 2010 09:44:49
Вопрос не в том, как посчитать синус, а какие средства есть в Питоне для представления чисел с фиксированной запятой. Возможно, есть модули, о наличии которых я не знаю, или приемы с учетом специфики самого Питона. Не забываем главного, что это должно работать быстрее (т.к. это один из способов оптимизации), чем операции над цифрами с плавающей точкой.
О приведении к fixed point вычитал на одном из сайтов, где для представления таких чисел используется тип long. Это нормально, если учитывать кол-во знаков после запятой. После первых попыток заметил, что скорость вычислений только упала (с числами типа int Питон оперирует быстрее). Опыта у меня не хватает, поэтому и подумал, что лучше не изобретать велосипед, а спросить на форуме… где некоторые товарищи мне советуют считать все в бесконечном цикле? =)
Андрей Светлов
Март 5, 2010 10:04:57
Если вы собираетесь запускать ваш код на копьютере, а не специфическом устройстве вроде микроконтроллера без сопроцессора - используйте float (double для С). CPU сделает все быстрее.
Fixed point нужен там, где нет хорошей аппаратной поддержки floating point - или если вы считаете деньги.
mks
Март 5, 2010 11:49:49
Для расчёта sin, cos, arctg еще используют CORDIC алгоритм, который легко реализуется на целочисленной арифметике. Это итерационный метод расчёта на основе формул поворота координат. Для его реализации нужно только суммирование и сдвиг. По памяти для точности <0.1 град. нужно около 12 итераций. А вообще все зависит от аппаратных возможностей платформы под которую вы пишете.