2013-11-11 4 views
1

Короче говоря, мой вопрос:Индексирование Matlab использует числа с плавающей запятой?

Является ли double в Matlab действительно двойным, или это класс с дополнительным свойством, действующим как целое число?

А вот контекст и мотивация к этому вопросу :)

>> 1:4 
ans = 
    1  2  3  4 
>> class(ans) 
ans = 
double 

Просто делать это создает двойной ...

>> 1.00:4.00 
ans = 
    1  2  3  4 
>> class(ans) 
ans = 
double 

..., как это делает, даже если это напечатано как целые числа.

Характер чисел с плавающей запятой показывает только тогда, когда вводится большая численная неопределенность.

>> acosd(cosd(1:4)) 
ans = 
    0.999999999999900 1.999999999999947 3.000000000000045 4.000000000000041 

Является двойной в Matlab действительно двойной, или это класс с дополнительным свойством действовать как целое?


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

>> A = [9 8 7 6] 
A = 
    9  8  7  6 
>> idx = [4 3 2 1] 
idx = 
    4  3  2  1 
>> class(idx) 
ans = 
double 
>> A(idx) 
ans = 
    6  7  8  9 

Я также попытался A(acosd(cosd(1:4))), который не работает.

ответ

5

Это просто двойной, но ваш command prompt format дает вам самый компактный вид. В частности,

format short 

Но вы можете изменить его, чтобы всегда отображать десятичные, и многие из них, с

format longEng 

Есть много других вариантов на странице format помощи.

Интересно, что you can use non-integer numbers as indexes with the colon operator, но он будет предупреждать. Я бы принял это предупреждение серьезно, поскольку это поведение индексации является нечетным.

Как я упомянул в своих комментариях, причина в том, что MATLAB подходит для использования double s для индексирования имеет отношение к the largest value of an integer that can be specified without losing precision in MATLAB. Двойная точность (64-разрядная) чисел с плавающей запятой может точно представлять целые числа до 2^53 (9 007 199 994 740 992) без потери точности. maximum array size allowed by MATLAB намного ниже этого числа, поэтому нет риска ошибок индексирования в результате точности с плавающей запятой.

+0

Но как же я могу индексировать с удвоениями, когда они определены как '[4 3 2 1]', но не тогда, когда они имеют (допустимую) меньшую точность с плавающей запятой (по сравнению с тем, когда они устанавливаются в оригинале)? Угадайте, что Matlab следует отличать только от класса, а не от самого номера? – AllanLRH

+0

@NovicePhysicist 'double's не теряют точность до 53-бит, поэтому MATLAB позволяет использовать их (цифры более 9,007,199,254,740,992 потеряют точность). См. [Здесь] (http: // stackoverflow.ком/а/1848762/2778484). – chappjc

+0

@NovicePhysicist Если вы выполните тест с чем-то вроде 'x = rand (4,1); x (1.6: 2.4), x (1.2: 2.6) 'есть, очевидно, некоторое округление продолжается (усечение?). Я не знаю, что происходит, когда вы пытаетесь дать индекс около 9 квадриллионов, но я думаю, что это [максимальный размер массива в MATLAB на каждой зарегистрированной платформе] (http://www.mathworks.com/support/ решения/о/данные/1-IHYHFZ/index.html). – chappjc

4

В MATLAB все числовые литералы (т. Е. Номера в тексте вашей программы) интерпретируются как двойная точность. Вы должны явно указать их, чтобы получить какой-либо другой тип. Стоит помнить, что плавающая точка IEEE может точно представлять широкий диапазон целочисленных значений, вплоть до FLINTMAX.

+0

плюс 1 для 'flintmax' –

Смежные вопросы