2011-12-17 3 views
0

Если я запускаю этот код:Javascript Float32Array wierdness

var a = new Float32Array(3); 
a[0] = 1; 
a[1] = 1.1; 
a[2] = 1.00001; 

Я получаю этот результат для a:

[1, 1.100000023841858, 1.0000100135803223] 

Почему Float32Array винт с моими номерами, как это? Кроме того, как я могу узнать, какие числа могут быть точно представлены как 32-битный float?

+0

Возможный дубликат [понимания переменных с плавающей запятой] (http://stackoverflow.com/questions/2480699/understanding-floating-point-variables) –

+0

@muistooshort Я действительно знал ответ на этот вопрос раньше, хотя я вижу, что они очень похожи. Моя путаница возникла из-за того, что мне было трудно понять, почему 32-битный float не смог правильно сохранить номер, в то время как javascript вообще отлично работает. (Я забыл упомянуть, что «Float64Array», похоже, справляется с этими номерами, по крайней мере, в Chrome). – benekastah

ответ

3

32-битное число с плавающей запятой имеет только 7 значащих цифр. Это нормально для числа с плавающей запятой, которое должно быть сохранено как ближайшая возможная аппроксимация определенного числа.

32-битное число с плавающей запятой просто не может сохранить значение 1.1 точно, ближайшим значением, которое он может хранить, является 1.100000023841858.

Для семи значащих цифр число по-прежнему является точным, то есть 1.100000.

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

Если предположить, что эти 32-битные поплавки с использованием стандарта IIIE 754, они могут представлять значения в диапазоне от 1,18 * 10 -38 до 3,4 * 10 38 .

+0

Спасибо, что объяснили, что 32-битные плавающие точки имеют семь значащих цифр. Исходя из динамического фона, это достаточно просто для меня, чтобы быстро схватить :) – benekastah

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