2015-05-06 7 views
2

Я попытался вычислить квадратный корень типа int32 переменную с помощью функции sqrt(), но я получил эту ошибку: Неопределенная функция «SQRT» для входных аргументов типа «int32». Затем я обнаружил, что есть функция, называемая isqrt(), которая вычисляет квадратный корень из целочисленных переменных типа, но она не существует в моей версии Matlab (R2013a). Я попытался загрузить эту функцию, но я не могу ее найти. Я попытался включить значение (1/2), но целые числа могут быть подняты только до положительных интегральных мощностей.Квадратный корень типа int32 переменной

Итак, есть ли способ сделать это?

ответ

3

Вы можете написать свой собственный isqrt используя анонимную функцию:

%// variable 
A = int32(16) 

%// helper function 
isqrt = @(x) int32(sqrt(double(x))) 

%// root 
iroot = isqrt(A) 

Эта функция должна использоваться только в том, что, если вы уверены, что это на самом деле можно вычислить корень, как отливка десятичное значение для int32(...) обойдется без него.

Итак, чтобы сделать его немного более надежным, вы могли бы создать функцию, как:

function iroot = isqrt(integer) 

    root = sqrt(double(integer)); 
    if mod(root,1) == 0 
     iroot = int32(root); 
    else 
     disp('Input has no integer root') 
    end 

end 
1

Вот решение, которое позволяет избежать округления, что происходит при преобразовании из двойной целочисленного типа с помощью fix, а также он поддерживает любой тип целого числа с помощью cast и class функции:

isqrt = @(x) cast(fix(sqrt(double(x))), class(x)); 

Так, например:

>> isqrt(int32(15)) 
ans = 
    3 

Однако

>> int32(sqrt(double(int32(15)))) 
ans = 
      4 

Использование fix вместо floor правильно обрабатывать отрицательные значения:

>> isqrt(int8(-15)) 
ans = 
    0 + 3i 
Смежные вопросы