LINUX.ORG.RU
решено ФорумTalks

Что может посчитать (-8)^(2/3) «из коробки»?

 ,


0

2

Пытался найти дробные, вещественные корни из отрицательного числа. Но, столкнулся с проблемой, что Gnu Octave и калькуляторы от HP(50G, Prime) выдают только комплексные числа в качестве ответов, выдают ошибку, если отключить работу с к.ч. или неверный ответ(-4). Немного погуглив, нашёл что этот пример (-8)^(2/3), зачастую, используют для демонстрации данной проблемы. Но, ПО, которое выдавало-бы вещественный ответ не нашёл(кроме эмуляторов калькуляторов от TI). Какое ПО может давать правильный ответ, в виде вещественного числа?



Последнее исправление: antoshka117 (всего исправлений: 1)

aidaho@vaio:~$ wcalc "(-8)^(2/3)"
 = Not a Number


Fail.

aidaho ★★★★★
()

возьми octave и просто в цикле получвшийся результат от power(-8,p/q) домножь на exp(2*pi*k*(p/q)*i) при k=1..q и выбери корень с наимешьим отклонением Arg от оси Re. По идее библиотечная функция, но такое нет походу...

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

Яндекс ненужен,есть гугол.В гугле еще и графики есть,причем даже 3D.Набери «x*y» попробуй

linuhs_user
()
Ответ на: комментарий от invy
bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
(-8)^(2/3)
1
zl0y
()
Последнее исправление: zl0y (всего исправлений: 1)
Ответ на: комментарий от zl0y

2/3.0

scale=4
(-8)^(2/3.0)
Runtime warning (func=(main), adr=14): non-zero scale in exponent
1

pacify ★★★★★
()
Последнее исправление: pacify (всего исправлений: 1)
$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> (-8) ** (2/3)
1
>>> (-8) ** (2.0/3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)
#!/usr/bin/python

from math import pow
from cmath import exp,log

print "math:",
try: print pow(-8.0,2.0/3.0)
except Exception, e: print repr(e)

print "cmath:",
try: print exp(2.0/3.0*log(-8.0))
except Exception, e: print repr(e)

# https://stackoverflow.com/questions/4114740/negative-pow-in-python

$ ./8pow23.py 
math: ValueError('math domain error',)
cmath: (-2+3.46410161514j)
pacify ★★★★★
()

ещё до кучи из стабильного дебиана

$ concalc
(-8.0)^(2.0/3.0)
-nan

--- 8pow23.gnu:
plot x+(-8.0)**(2.0/3.0)
pause -1

$ gnuplot 8pow23.gnu 

plot x+(-8.0)**(2.0/3.0)
                        ^
«8pow23.gnu», line 2: all points y value undefined!
pacify ★★★★★
()

Откуда здесь однозначный ответ? В общем случае,

[latex](-8)^{2/3} = (e^{(2k+1)i\pi} 8)^{2/3} = 4 e^{2(2k+1)i\pi/3}[/latex]

Итого, три возможных варианта при k=0,1,2:
[latex]4 e^{2i\pi/3}[/latex], [latex]4[/latex], [latex]4 e^{-2i\pi/3}[/latex].

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

в третьем норм

>>> (-8)**(2/3)
(-1.999999999999999+3.464101615137755j)

f3ex ★★
()

Что-то вы не хорошее хотите. Как расставили скобки так они и считают. Хотите вещественный ответ - пишите (-8)^2^(1/3).

unDEFER ★★★★★
()

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

Для этого представляем -8 в виде комплексного числа:

-8 = 8 * e^(j*pi)

И довозводим все в степень (2/3):

(8 * e^(j*pi)) ^ (2/3) = 8^(2/3) * e^(j*pi * 2/3)

= 4 * (cos(2*pi/3) + j*sin(2*pi/3))

= 4 * (-.5 + j*0.86602540378)

= -2 + j*3.46410161512

С точки зрения производителей какуляторов было-бы огромной ошибкой пытаться «оптимизировать» и считать это как (-8)^2^(1/3)

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 2)

В действительном анализе показательная функция вводится только с неотрицательными основаниями. Иначе там есть подводные камни. Так что не думаю, что калькуляторы вообще должны париться с действительными числами в данной задаче.

aquadon ★★★★★
()

Такое даже компиляторы Фортрана могут запрещать:

Error: Raising a negative REAL at (1) to a REAL power is prohibited

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

Можно и не через сам тип:

      program main
       real :: x
       x = (cmplx(-8.0)) ** (2.0/3.0)
       write (*, *) x
      end
  -2.00000024
А вот без комплексной формы - никак.

saahriktu ★★★★★
()

выдают только комплексные числа в качестве ответов

(-8)^(2/3) = exp(ln(-8)*2/3) = exp((ln(8) + i\pi)*2/3) = exp(ln(8)*2/3) * exp(i *2 *\pi/3) = 2 * (-1 + i * sqrt(3))

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

Ну и еще несколько результатов будет, т.к. ln(-8) = ln(8) + (2n+1)*i\pi

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.