Fround: примеры (JAVASCRIPT)
fround(number): numberОписание Math.fround
Метод Math.fround() возвращает ближайшее число с плавающей запятой одинарной точности (32 бита), представленное в формате IEEE 754, к переданному числу. Это статический метод объекта Math.
Функция используется для приведения чисел двойной точности (64 бита, стандарт для JavaScript) к одинарной точности. Такое преобразование бывает полезно при:
- Эмуляции вычислений в 32-битной точности (например, для совместимости с WebGL, где часто используются 32-битные float).
- Сокращении объема передаваемых данных.
- Тестировании алгоритмов на чувствительность к потере точности.
Аргументы: функция принимает один обязательный аргумент x - число, которое нужно преобразовать. Если аргумент не является числом, он будет неявно преобразован к числу.
Возвращаемое значение: число, представляющее собой ближайшее представление аргумента x в 32-битном формате с плавающей запятой (одинарная точность). Для специальных числовых значений (NaN, Infinity) возвращается то же значение. Если значение x не может быть преобразовано в число, возвращается NaN.
Краткие примеры использования
Базовое преобразование чисел:
console.log(Math.fround(1.5)); // 1.5
console.log(Math.fround(1.337)); // 1.33700001239776611.5
1.3370000123977661
Работа с большими числами:
console.log(Math.fround(1.0000000123)); // 1.0000000123?
console.log(Math.fround(123456.789));1.0000000123
123456.7890625
Особые случаи:
console.log(Math.fround(NaN));
console.log(Math.fround(Infinity));
console.log(Math.fround(-Infinity));NaN
Infinity
-Infinity
Похожие функции в JavaScript
Math.round() - округляет число до ближайшего целого. Используется для обычного округления, а не для изменения точности представления числа.
parseFloat() - преобразует строку в число с плавающей запятой двойной точности. Не меняет внутреннее представление числа, только тип.
Number.toPrecision() - возвращает строку, представляющую число с указанной точностью. Меняет только строковое представление, но не само число.
Float32Array - типизированный массив для работы с 32-битными числами с плавающей запятой. Позволяет хранить и обрабатывать множественные значения в одинарной точности.
Альтернативы в других языках
Python: модуль numpy предоставляет тип float32.
import numpy as np
arr = np.array([1.337], dtype=np.float32)
print(arr[0]) # 1.3371.337
C/C++: явное приведение типов к float (обычно 32-битному).
double d = 1.337;
float f = (float)d;
// f содержит 32-битное представление 1.337PHP: нет прямой аналогии, числа всегда представлены в двойной точности или как целые.
MySQL: типы FLOAT (32-бит) и DOUBLE (64-бит) для хранения в таблицах.
Типичные ошибки
Ожидание точного преобразования: преобразование может привести к потере точности.
let num = 1.337;
let f32 = Math.fround(num);
console.log(num === f32); // false
console.log(f32); // 1.3370000123977661false
1.3370000123977661
Неправильная обработка нечисловых аргументов:
console.log(Math.fround("текст")); // NaN
console.log(Math.fround(null)); // 0
console.log(Math.fround(undefined)); // NaNNaN
0
NaN
История изменений
Метод Math.fround() был добавлен в спецификацию ECMAScript 6 (ES2015). До этого в JavaScript не было стандартного способа приведения чисел к одинарной точности. Полифилы эмулировали эту функцию с помощью Float32Array, если он был доступен.
С момента введения в ES6 сигнатура и поведение функции не изменялись. Все современные браузеры поддерживают этот метод.
Расширенные примеры
Сравнение точности представления чисел:
function comparePrecision(num) {
let f32 = Math.fround(num);
let diff = Math.abs(num - f32);
return { original: num, f32: f32, difference: diff };
}
console.log(comparePrecision(1.0000000123));
console.log(comparePrecision(0.1 + 0.2));{ original: 1.0000000123, f32: 1.0000000123, difference: 0 }
{ original: 0.30000000000000004, f32: 0.30000001192092896, difference: ~1.192e-9 }Использование в WebGL контексте для uniform-переменных:
// Эмуляция установки uniform-переменной в шейдер
let shaderValue = 3.14159265359;
let glValue = Math.fround(shaderValue);
// gl.uniform1f(location, glValue);Массовое преобразование массивов:
function convertArrayToF32(arr) {
return arr.map(item => Math.fround(item));
}
let doubleArr = [1.1, 2.2, 3.3, 4.4, 5.5];
console.log(convertArrayToF32(doubleArr));[1.100000023841858, 2.200000047683716, 3.299999952316284, 4.400000095367432, 5.5]
Создание полифила для старых браузеров:
if (!Math.fround) {
Math.fround = (function() {
var temp = new Float32Array(1);
return function fround(x) {
temp[0] = x;
return temp[0];
};
})();
}