MATLAB - странная ошибка целых и десятичных чисел - PullRequest
2 голосов
/ 06 марта 2012
newT = [b(i) d(i) a(i) z(i)];
newT, b(i), a(i)

Отпечатки

newT =

     123         364         123         902

ans =

 1.234e+02

ans =

 1.234e+02

В чем проблемаВот?Почему первая и третья записи в newT округляются до целых значений?Почему они не назначены правильно?

1 Ответ

3 голосов
/ 06 марта 2012

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

>> int32(3) + 0.4
ans =
           3
>> [int32(3)  0.4]
ans =
           3           0

Это по историческим причинам, потому что (IIRC)Изначально в Matlab вообще не было поддержки целых чисел, поэтому все числовые константы в Matlab выдают двойные значения, и правила продвижения были созданы, чтобы можно было смешивать целочисленные типы с константами с плавающей запятой.

Исправитьэто, перед преобразованием явно преобразовать эти типы int в double.

newT = [b(i) double(d(i)) a(i) double(z(i))];
...