Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/65: Рейтинг темы: голосов - 65, средняя оценка - 4.62
3 / 3 / 2
Регистрация: 24.05.2010
Сообщений: 56

Погрешность при выполнении операций с вещественными числами

22.03.2011, 12:38. Показов 13683. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот в ходе изучения…назрел еще один вопросик)
2.39 * 5 с каких это пор оно стало равно о_О 11.950000000000001 ?
и как после этого верить программам))?
наверное все знают что php иногда плох в математике…но java…настолько хорошая и всеми хваленая…

ну это еще не все…раньше тип бил double потом решил float использовать…результат уже не удивил(11.950001), но назрел другой вопрос…ну вот написал примером
Java
1
2
3
4
float i;
i=2.39; //и тут  -  possible loss of precision;found : double;required: float
//а так все ок
i=(float)2.39;//это почему 2.39 не float?  чем оно float'y не догодило?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2011, 12:38
Ответы с готовыми решениями:

Разработать DLL для исследования операций сравнения при работе с целыми и вещественными числами
Разработать DLL для исследования операций сравнения <=, >=, ==, != при работе с целыми и вещественными числами. В библиотеку...

Устранить округление при выполнении арифметических операций над числами
Если написать так pk равен 833 long long S=Edit1->Text.ToInt(); long long n=Edit2->Text.ToInt(); long double pk=S/n; если...

Реализация арифметических операций над вещественными числами
Здравствуйте. Помогите пожалуйста реализовать алгоритмы арифметических операций(+ - * /) над вещественными числами на любом языке...

7
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
22.03.2011, 13:41
Цитата Сообщение от McBodik Посмотреть сообщение
.39 * 5 с каких это пор оно стало равно о_О 11.950000000000001
Это всем(даже начинающим программистам) известная вещь, которая связана с особенностями хранения вещественных чисел в памяти. Т.е. не факт, что 2.0 * 2.0 == 4.0.
К вашему сведению, такая проблема существует не только в Java, она есть также и во всех остальных языках программирования и фраза
Цитата Сообщение от McBodik Посмотреть сообщение
но java…настолько хорошая и всеми хваленая…
просто не уместна.

По умолчанию все вещественные числа в Java - это double, поэтому нет ничего странного в этом сообщении. Вы можете явно указать, что хотите использовать float добавив в конце f, т.е.
Java
1
i = 2.39f;
Точно так же обстоит дело и с int - long, для того чтобы указать, что это long в конце ставится символ L.
По поводу
Цитата Сообщение от McBodik Посмотреть сообщение
possible loss of precision
дело в том, что double имеет большую точность, поэтому при попытке записи числа с бОльшей точностью во float вы можете потерять данные, о чем вас и предупреждают
1
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
22.03.2011, 14:40
Цитата Сообщение от McBodik Посмотреть сообщение
2.39 * 5 с каких это пор оно стало равно о_О 11.950000000000001 ?
и как после этого верить программам))?
Контрольный в голову:

Java
1
2
3
4
float f1 = 0.3f;
float f2 = 0.4f;
float f3 = 0.7f;
System.out.println("0.3+0.4==0.7: "+((f1+f2)==f3));
Верить надо программам, которые написаны правильно. А у чисел с плавающей точкой точность сильно ограничена. Из-за этого их категорически нельзя использовать в финансовых операциях.
1
3 / 3 / 2
Регистрация: 24.05.2010
Сообщений: 56
22.03.2011, 15:05  [ТС]
Цитата Сообщение от M128K145 Посмотреть сообщение
Это всем(даже начинающим программистам) известная вещь
конешно вещь известная, но не в таких числах… если там в периоде будет число…*но это красивое, круглое…
в с++ с такими числами не было таких проблем, даже в c# который какбы на равне с java…

а за остальное спасибо.


Цитата Сообщение от Skipy Посмотреть сообщение
Контрольный в голову:
убил наповал…*


Цитата Сообщение от Skipy Посмотреть сообщение
нельзя использовать в финансовых операциях
ну а припустим если надо… то что делать?)


Цитата Сообщение от Skipy Посмотреть сообщение
написаны правильно.
и что под этим вы подразумеваете?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
22.03.2011, 15:33
Цитата Сообщение от McBodik Посмотреть сообщение
ну а припустим если надо… то что делать?)
java.math.BigDecimal

Цитата Сообщение от McBodik Посмотреть сообщение
и что под этим вы подразумеваете?
1. Сравнение вещественных чисел с учетом точности. Выше приведен пример сравнения двух float. Простое равенство дает false. А вот другой вариант:

Java
1
System.out.println("0.3+0.4-0.7 < 0.0000001: "+((f1+f2-f3)<1e-7));
Разница меньше точности представления.

2. Использование BigDecimal для точных расчетов.

При работе с вещественными числами нужно просто учитывать границы применимости данных методов.
0
3 / 3 / 2
Регистрация: 24.05.2010
Сообщений: 56
22.03.2011, 15:45  [ТС]
java.math.BigDecimal
ну тогда уж совсем дурацкий вопрос -…*ну если так все работает верно, не могли ли они сделать чтоб и без этого класа все било ок?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
22.03.2011, 16:40
Не могли. Вещественные числа обрабатываются процессором, вернее, его FPU. Соответственно, они ограничены стандартом IEEE 754. А BigDecimal держит отдельно мантиссу произвольной длины и отдельно - степень. Фактически, он с дробными не работает, он их эмулирует.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
12.11.2016, 21:41
Всех приветствую. А что делать,если библиотеки используют тип double,но хочется получить результат поточнее. Например библиотека xp4j для распознавания математических выражений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2016, 21:41
Помогаю со студенческими работами здесь

Разработать электронный калькулятор для операций над вещественными числами
Создать приложение Приложение должно содержать базовый набор управляющих элементов (главное меню, строка состояния и т. п.) ...

Процедуры и функции: выполнить над вещественными числами а и в одну из арифметических операций
Описать функцию calc(a,b, op) вещественного типа , выполняют уж над не нулевыми вещественными числами а и в одну из арифметических операций...

Класс MyMath обеспечивающий выполнение операций сравнения над двумя вещественными числами
Класс должен включать в себя поля x и y (числа, над которыми выполняются операции), а также следующие методы: • bool isequal() –...

Разработать класс MyMath, обеспечивающий выполнение операций сравнения над двумя вещественными числами
Помогите написать код программы..я в тупике, не получается написать код.. Разработать класс MyMath, обеспечивающий выполнение...

Разработать класс MyMath, обеспечивающий выполнение операций сравнения над двумя вещественными числами
Класс должен включать в себя поля x и y (числа, над которыми выполняются операции), а также следующие методы: • bool isequal() –...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru