PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » "Велосипед" по возведению в степень


"Велосипед" по возведению в степень

Сообщений 1 страница 4 из 4

1

Код:
Procedure.d mAbs(x.d)
  If  x<0
    ProcedureReturn -x
  EndIf
  ProcedureReturn x
EndProcedure

Procedure.d mExp(x.d)
  term.d = 1.0
  result.d = 1.0 
  i = 1
  Repeat
    term = term * x / i
    result + term
    i + 1
  Until mAbs(term) < 1.0e-15
  ProcedureReturn result
EndProcedure

Procedure.d mLog(n.d)
  If n <= 0
     ProcedureReturn 0
  EndIf
  x.d = n - 1
  Repeat
    e.d = mExp(x)
    new_x.d = x - (e - n) / e
    If mAbs(new_x - x) < 1e-15
      Break
    EndIf
    x = new_x
  ForEver
  ProcedureReturn x
EndProcedure

Procedure.d mPow(a.d, b.d)
  If a = 0 And b < 0
    ProcedureReturn 0 ; Возвращаем 0, так как это неопределенное значение
  EndIf
  ProcedureReturn mExp(b * mLog(a))
EndProcedure

Debug mPow(2,1.987654)
Debug Pow(2,1.987654)

в качестве примера - пригодно

Отредактировано PSY (08.02.2025 01:27:52)

0

2

Стесняюсь спросить - а переполнение как-то учитывается?

0

3

Код:
Debug mPow(2,64)
Debug Pow(2,64)

1e-15 заменить можно на меньшее и точность будет выше. А какое тут может быть переполнение? 8-)
Если с этим примером - то тут уже запредельное ибо числа могут быть отрицательное, вот если было бы unsigned (беззнаковое) то да, можно было бы не переполнить. Функция моя медленная, но она реализована лишь арифметикой.

Отредактировано PSY (08.02.2025 22:46:30)

0

4

PSY написал(а):

1e-15 заменить можно на меньшее и точность будет выше. А какое тут может быть переполнение?
Если с этим примером - то тут уже запредельное ибо числа могут быть отрицательное, вот если было бы unsigned (беззнаковое) то да, можно было бы не переполнить. Функция моя медленная, но она реализована лишь арифметикой.

Отредактировано PSY (Вчера 22:46:30)

2^64=18446744073709551616
Немного отличается результат.

Код:
r$="1"

OpenConsole()
For k=0 To 42
  
;Debug Str(k)+":"+ReverseString(r$)
PrintN(Str(k)+":"+ReverseString(r$))
  
  d2=0
  t$=""
  For n=1 To Len(r$)
    dd=Val( Mid( r$,n,1 ) )*2+d2
    t$=t$+Str(dd%10)
    d2=Int(dd/10)
  Next n
  If d2
    t$=t$+Str(d2)
  EndIf
  r$=t$
Next k

Input()
CloseConsole()

0


Вы здесь » PureBasic - форум » OpenSource » "Велосипед" по возведению в степень