Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сложение двух чисел в Java SE / 11 сообщений из 11, страница 1 из 1
21.02.2017, 02:05
    #39408199
sashavak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
Здравствуйте.

Я хочу понять: как Java складывает 2 double значения (на машинном уровне или уровне двоич.) и почему она не дает правильный ответ?

Те, что происходит на глубоком уровне (шаг за шагом)?

Пример:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class GalToLitTable {
  
    public static void main(String[] args) {
  
        System.out.println(3.7854 + 3.7854);
        System.out.println(7.5708 + 3.7854);
  
    }
  
}



After run:

7.5708
11.356200000000001

НО должно быть:

7.5708
11.3562


Я хочу понять (шаг за шагом):

1. Как Java преобраз. эти значения в двоич?

2. Какое представление этого двоичн ( 80 или 64 бит длины)?

3. Как Java округл. этот двоич. (7.5708 and 3.7854 not exact convert to binary, how java rounding this binary (last bit) or java cuts this binary after 64 bit without rounding)?

4. Как Java суммир. два бинарных значения?

5. Как Java округл. эту двоич. сумму?

6. Как Java преобразов. двоич. сумму в десятичную сумму?

Вот как я сам ответил на первые 3 вопроса:

7.5708 = 0 10000000001 1110010010000111111111001011100100100011101000101010 (Inexact, 1+11+52 bit = 64 bit)

3.7854 = 0 10000000000 1110010010000111111111001011100100100011101000101010 (Inexact, 1+11+52 bit = 64 bit)

Java has Round-Half-Even (Banker's Rounding), when convert decimal to binary.

Я прав?
...
Рейтинг: 0 / 0
21.02.2017, 04:40
    #39408212
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
sashavak, https://www.ibm.com/developerworks/ru/library/j-jtp0114/ Использование чисел с плавающей точкой и десятичных чисел в программах Java чревато трудностями. Числа с плавающей точкой и десятичные числа ведут себя совсем не так хорошо как целые, и Вы не можете предположить, что в действительности делают вычисления с плавающей точкой, у которых "должны" быть целочисленные или точные результаты. Лучше всего приберечь использование арифметики с плавающей точкой для вычислений, которые требуют принципиально неточных значений, например измерений. Если Вам необходимо представить величины с фиксированной точкой, например, доллары и центы, то используйте BigDecimal
...
Рейтинг: 0 / 0
21.02.2017, 06:25
    #39408222
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
sashavak1. Как Java преобраз. эти значения в двоич?


Как все. то же будет в Си.
...
Рейтинг: 0 / 0
21.02.2017, 07:49
    #39408239
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
...
Рейтинг: 0 / 0
21.02.2017, 09:27
    #39408289
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
sashavak1. Как Java преобраз. эти значения в двоич?

tutorialThe double data type is a double-precision 64-bit IEEE 754 floating point.
https://ru.wikipedia.org/wiki/IEEE_754-2008

sashavak2. Какое представление этого двоичн ( 80 или 64 бит длины)?

RTFM

sashavak3. Как Java округл. этот двоич. (7.5708 and 3.7854 not exact convert to binary, how java rounding this binary (last bit) or java cuts this binary after 64 bit without rounding)?

Никак не округляет. Возьми и переведи приведенные значение в двоичный вид, а затем обратно.

sashavak4. Как Java суммир. два бинарных значения?

А какие есть варианты?

sashavak5. Как Java округл. эту двоич. сумму?

Смотри #3 - никто ничего не округляет. Просто при выводе, есть определенный лимит для десятичных символов.

[/quot]
6. Как Java преобразов. двоич. сумму в десятичную сумму?
[/quot]
Чем "сумма" отличается от "числа"?

Ещё ссылки из гугла для любознательных
https://habrahabr.ru/post/112953/
https://neerc.ifmo.ru/wiki/index.php?title=Представление_вещественных_чисел
http://www.softelectro.ru/ieee754.html
...
Рейтинг: 0 / 0
21.02.2017, 10:06
    #39408307
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
sashavakи почему она не дает правильный ответ?
1/3 = 0.3333
0.3333+0.3333+0.3333=0.9999
1=0.9999
...
Рейтинг: 0 / 0
21.02.2017, 16:13
    #39408586
sashavak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
Blazkowicz, большое спасибо, но хотелось бы все понять по шагам.
...
Рейтинг: 0 / 0
21.02.2017, 16:26
    #39408599
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
sashavakBlazkowicz, большое спасибо, но хотелось бы все понять по шагам.

Десятичное в двоичное
http://class.ece.iastate.edu/arun/Cpre305/ieee754/ie4.html
Сложение
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BinMath/addFloat.html
Двоичное в десятичное
http://class.ece.iastate.edu/arun/CprE281_F05/ieee754/ie5.html

Вопросы?
...
Рейтинг: 0 / 0
22.02.2017, 11:06
    #39408954
ponuch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
...
Рейтинг: 0 / 0
05.03.2017, 23:10
    #39414424
sashavak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
BlazkowiczsashavakBlazkowicz, большое спасибо, но хотелось бы все понять по шагам.

Десятичное в двоичное
http://class.ece.iastate.edu/arun/Cpre305/ieee754/ie4.html
Сложение
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BinMath/addFloat.html
Двоичное в десятичное
http://class.ece.iastate.edu/arun/CprE281_F05/ieee754/ie5.html

Вопросы?



В этих материалах совершенно не поднимаются вопросы округления.

Раз уже коснулись темы округления то я бы хотел для начала более подробно проконсультироваться у вас по поводу первых трех моих вопросов c моими доп. объяснениями:

1. Как Java преобраз. эти значения в двоич? С этим более менее мне понятно:

7.5708 = 0 10000000001 1110010010000111111111001011100100100011101000101010 (Inexact, 1+11+52 bit = 64 bit)

3.7854 = 0 10000000000 1110010010000111111111001011100100100011101000101010 (Inexact, 1+11+52 bit = 64 bit)

За исключением того, что это уже округленные значения.

2. Какое представление этого двоичн. ( 80 или 64 бит длины)?

Понятно что в конечном итоге буде 64 битное представление указанное выше, но перед тем как оно будет java перекидывает десятичное значение в 80 битное (или даже больше, не знаю точно какое) двоичное представление, а затем округляет его методом Java has Round-Half-Even (Banker's Rounding) но как он пошагово действует я не понимаю , может быть вы знаете?

3. Как Java округл. этот двоич. (7.5708 and 3.7854 не могут точно быть преобразованы в двоичн., java округляет их в последнем или нескольких последних битах)?

Хотелось бы ваших более подробных комментариев по моим первым 3 вопросам.
...
Рейтинг: 0 / 0
06.03.2017, 02:24
    #39414446
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложение двух чисел в Java SE
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сложение двух чисел в Java SE / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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