Мне было интересно, точно ли представляются значения 1/256, 2/256, 3/256, ... 254/256 и 255/256 как f32
.Теперь кто-то умный подумает о том, как работают числа с плавающей запятой, и выяснит это.Но я хотел бы проверить это в программе.Все числа, которые я хочу проверить, являются дробями, и я управляю значениями (т.е. без ввода данных пользователем).
Я начал с этого:
for n in 1u8..=255 {
let f = (n as f32) / 256.0;
println!("{}", f);
}
Но что теперь?Я попытался напечатать число, чтобы увидеть, было ли большое количество повторяющихся цифр, но это не всегда работает.Например, 0,4, которое не совсем представимо:
println!("{}", 0.4); // prints "0.4"
println!("{:.20}", 0.4); // prints "0.40000000000000002220"
Здесь мы должны вручную повысить точность, чтобы увидеть проблемы.И в любом случае, просмотр выходных данных в любом случае кажется неоптимальным решением.
Сначала я подумал, что может быть метод для f32
, но это не имеет большого смысла, не так ли?Потому что, когда f32
уже существует, нет способа узнать, предназначено ли его значение или нет.Таким образом, мы как-то должны выяснить при создании значения с плавающей запятой и сравнить с «идеализированным» значением?
Есть ли способ проверить, может ли значение быть точно представлено как f32
?