![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 01.04.2008
Сообщений: 58
|
![]()
Пробывал полистать страницы форума и воспользоватся поисковим, но так и не нашел похожего поднимающегося вопроса.
Проблема вот в чем. Например, происходит елементарный перещет: float a = 1; for(a;a<10;a+=0.2) { cout<<a; } Вместо того, чтобы выводить 1, 1.2, 1.4, 1.6... Начинает выводить так: 1, 1.2, 1.4, 1.6, 1.799999, 1.99999 Вопрос: Куда деваются эти миллионные доли числа и как с этим бороться? Пишу на .NET. Числа берутся с формы и происходят похожие математические общеты. Потом эти числа выводятся на график. Мне нужно чтоб было 1.8, а оно вдает 1.799999. Работаю с типом флоат ибо в .NET есть тип PointF... Я сберигаю ети числа в масиве данного типа, а потом вывожу на экран. Может стоит работать с double, а потом преобразовывать в float, или... Подскажите какой-то выход плиз. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 24.11.2007
Сообщений: 196
|
![]()
перед cout<<a;
Код:
Последний раз редактировалось Goblin; 07.02.2009 в 19:39. Причина: Реклама |
![]() |
![]() |
![]() |
#3 |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
![]()
Можно проще. Когда выводите пишете вот так
Код:
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 01.04.2008
Сообщений: 58
|
![]()
Походу вы меня не поняли или я не понял вас.
Этот пример я привел чисто для того, чтобы обьяснить суть проблемы и как приблизительно!!! она получается. 1. пишу на шарпе, значения принимаются с формы, обрабатываются и выводятся на форму с помощью DrawString.... 2. Важно!!! не применять какие-либо либо математические преобразования и тем более форматированый способ вывода на экран. Пишется программа эммулирующая протекание тех. процессов в энергетике. Потому точность важна! 3. Мне важен резутьтат! Т.е. если на бумажке я прощитал и вышло 1.8, то и на форму должно вывестись 1.8 а не 1.799999. Потому что выводимые числа могут быть такими к примеру: 0.0077... И никак не должно вывестись 0.0076999. Вот чего я боюсь. Т.е. 1.79999 или 799.9999 я могу привести к 1.8 и 800, а что делать с 0.0076999? Можна алгоритм разработать который будет проверять числа и исправлять, но это явно усложнит код. Можна расчеты проводить в двоичном виде, но каждый выводимый график может иметь миллион или два миллиона значений прощитаных... Прикиньте для каждого анализировать полученый результат???!!! Потому думаю, что проблема все же в преобразовании типов или с чем-то похожим. Но как исправить... Может перед кем-то стояла похожая проблема? П.С. Если кто-то подскажет как с этим борится к примеру MatLab или MathCad или Exel или другие программы работающие с графиками и трендами - буду благодарен. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 06.12.2008
Сообщений: 613
|
![]()
вещественная арифметика в машине не точна - это значит, что сложив 1000 раз число 0.001 вы никогда не получите ровно 1 ( единицу ) - всегда будут погрешности в вычислении - это связано с внутренним представлением вещественных чисел в машине; точность float - 38 знаков после запятой; из курса математики известно, что 0.8 можно представить как 0.800000... и 0.799999... - это одно и то же- попробуйте выполнить преобразование из десятичной дроби с натуральную: восьмерка обеспечена
![]() Последний раз редактировалось capta1n; 08.02.2009 в 16:04. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 06.12.2008
Сообщений: 613
|
![]() Код:
Код:
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 01.04.2008
Сообщений: 58
|
![]()
Умная мысль! Щас проверю!
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Точность при переходе от миллиметров к пунктам | viter.alex | Microsoft Office Word | 2 | 03.02.2009 16:36 |
точность вывода переменной | XeN0N | Помощь студентам | 6 | 21.01.2009 16:30 |
Точность | Sour | Помощь студентам | 2 | 31.05.2007 21:08 |