Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вывести точное значение float'а? / 13 сообщений из 13, страница 1 из 1
05.08.2020, 02:16
    #39986548
denbkh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Есть набор бит, нужно его сконвертировать во float и вывести точное значение. Как это сделать в Java?
Для примера, вот такой набор из 32-х бит "00111111100000000000000000000001" при записи во float представляет число 1.00000011920928955078125. Проверить, что это так, можно например на сайте https://www.h-schmidt.net/FloatConverter/IEEE754.html
Но, простым printf выводится совсем другое значение float'a.
Код: java
1.
2.
3.
int bits = Integer.parseInt("00111111100000000000000000000001", 2);
float fval = Float.intBitsToFloat(bits);
System.out.printf("%.23f", fval);


Такой код выводит 1.000000 1192092896 0000000. А мне нужно получить 1.000000 11920928955078125 . Как это сделать?
...
Рейтинг: 0 / 0
05.08.2020, 07:59
    #39986572
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Float и "точное значение" - это оксюморон.
Возможно тут вы сможете найти ответ на свой вопрос
Еще есть предположение, что сам System.out.printf округляет значение.
Каково значение fval в отладчике?
...
Рейтинг: 0 / 0
05.08.2020, 19:30
    #39986861
denbkh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Никакой это не оксюморон, в стандарте IEEE 754 каждому значению набора бит во float'е соответсвует одно определённое число. Вот его и нужно вывести.
В отладчике показывает "1.0000001", но там просто используется Float.toString(), а он показывает приблизательно. Из документации к этому методу: "There must be at least one digit to represent the fractional part, and beyond that as many, but only as many, more digits as are needed to uniquely distinguish the argument value from adjacent values of type float."
...
Рейтинг: 0 / 0
06.08.2020, 00:46
    #39986909
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Можно создать BigDecimal на основе float-а и его распечатать - должен получить нужное значение
...
Рейтинг: 0 / 0
06.08.2020, 07:22
    #39986923
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
denbkh
Никакой это не оксюморон, в стандарте IEEE 754 каждому значению набора бит во float'е соответсвует одно определённое число.
Не каждому. +0 и -0 - одинаковые числа, но разные битовые значения.
...
Рейтинг: 0 / 0
06.08.2020, 07:54
    #39986925
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
denbkh
Никакой это не оксюморон
Оксюморон - далеко не каждое рациональное число представимо конечной десятичной дробью.

P.S.
Судя по javadoc toString(fload) выводит разные строковые значения для разных битовых значений float. Необязательно точные, но разных для разных.
...
Рейтинг: 0 / 0
06.08.2020, 15:31
    #39987161
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
WikiЧисла одинарной точности с плавающей запятой эквивалентны по точности числу с 7-8 значащими десятичными цифрами (в среднем 7,6)


denbkh

Такой код выводит 1.000000 1192092896 0000000.

Загибаем пальца:
1 = 1
1 = 2
9 = 3
2 = 4
0 = 5
9 = 6
2 = 7
8 = 8
9 = 9
6 = 10
Википедия обещала, что точность float 7-8 знаков, toString даже перестарался

denbkh

А мне нужно получить 1.000000 11920928955078125 . Как это сделать?

http://proglang.su/java/numbers-random
с помощью данной ф-ции можно получить float любой точность ))) хоть 100500 знаков после запятой )))
...
Рейтинг: 0 / 0
06.08.2020, 17:45
    #39987215
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Вообще в плане точности 7-8 знаков, это больше похоже на эти цифры:
автор1. 00000011 920928955078125
Потому как это число равно 1 + 2 ^ -23 - минимальному ближайшему число после 1. Если надо точнее чем эти 8 цифр "00000011", то это уже сложно (ну если они не выражаются через степени двойки конечно)
...
Рейтинг: 0 / 0
06.08.2020, 18:12
    #39987226
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
denbkh,
я думаю, что вам нужно представление чисел с плавающей точкой в двойчной системе
(обычно это идет в одной из первых глав учебников по CS)
посмотрите вот это (и именно английский вариант!)
https://en.wikipedia.org/wiki/Floating-point_arithmetic
...
Рейтинг: 0 / 0
07.08.2020, 04:10
    #39987308
denbkh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
SpringMan
Можно создать BigDecimal на основе float-а и его распечатать - должен получить нужное значение

Спасибо, такой код
Код: java
1.
System.out.println(new BigDecimal(fval)); 


выводит нужное мне значение 1.00000011920928955078125!
...
Рейтинг: 0 / 0
07.08.2020, 04:39
    #39987310
denbkh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
Basil A. Sidorov
denbkh
Никакой это не оксюморон
Оксюморон - далеко не каждое рациональное число представимо конечной десятичной дробью.

Это так, но значение float'ов исходя из формулы их вычисления судя по всему всегда конечны, т.е без дроби их можно записать за конечное количество цифр после запятой. Если это не так, то для опровержения приведите float, точное значение которого нельзя записать за конечное количество цифр ;)
...
Рейтинг: 0 / 0
07.08.2020, 08:04
    #39987321
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
denbkh
Если это не так, то для опровержения приведите float, точное значение которого нельзя записать за конечное количество цифр ;)

Любое трансцендентное число.
Пи = 3.14159....
Е = 2.71828....
...
Рейтинг: 0 / 0
07.08.2020, 09:07
    #39987341
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести точное значение float'а?
SQL2008
denbkh
Если это не так, то для опровержения приведите float, точное значение которого нельзя записать за конечное количество цифр ;)

Любое трансцендентное число.
Пи = 3.14159....
Е = 2.71828....


Во float (и double) нельзя записать точно ни Пи, ни Е, ни даже 0.2
Так что Пи нельзя вывести, но его никогда не будет в компьютере.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вывести точное значение float'а? / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]