Russian Qt Forum
Января 19, 2025, 20:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Неожиданный результат при делении (1.0/10.0=0.10000000000000001 ?????????)  (Прочитано 12657 раз)
Dimon-st
Гость
« Ответ #15 : Июля 19, 2010, 20:22 »

Никаких стандартных функций округления я не нашел. Таким образом придется извращаться через преобразование в строку и обратно "QString QString::number". Правильно я понимаю ?
Записан
SimpleSunny
Гость
« Ответ #16 : Июля 19, 2010, 20:24 »

Я всё еще понять не могу, чем вас не устраивает точность числа порядка e16?
Записан
Dimon-st
Гость
« Ответ #17 : Июля 19, 2010, 20:49 »

Цитировать
Я всё еще понять не могу, чем вас не устраивает точность числа порядка e16?
Точность устраивает, просто для моего примера:
Цитировать
vLastValue=10, vFirstValue=0
задаем: vCount=101
и пересчитываем vStep и vFirstValue

vStep = (vLast - vFirst)/(vCount-1.0);
vFirstValue = vLast - vStep *(vCount-1.0);


Получаю
vStep=0.10000000000000001
vFirstValue=-5.55112e-16

Хотя, по идее должно быть:
vStep=0.1
vFirstValue=0
вместе с изменением vStep=0.10000000000000001 изменяется и vFirstValue=-5.55112e-16. И бороться с этим можно только округлением, но для этого придется всякий раз определять количество значащих разрядов vStep, которых больше, чем должно быть ... и опять замкнутый круг...
Записан
SimpleSunny
Гость
« Ответ #18 : Июля 19, 2010, 21:05 »

"То ли лыжи не едут, то ли я неординарный."

Если точность вас устраивает, как вы заметили выше, то в чем проблема, если vFirstValue == 0 с точностью, которая вас устраивает?

P.S. vFirstValue = vLast - vStep *(vCount-1.0); Если подставить vStep и раскрыть скобки, то получим vFirstValue = vFirst;
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июля 19, 2010, 21:09 »

вместе с изменением vStep=0.10000000000000001 изменяется и vFirstValue=-5.55112e-16. И бороться с этим можно только округлением, но для этого придется всякий раз определять количество значащих разрядов vStep, которых больше, чем должно быть ... и опять замкнутый круг...
Вам не с чем бороться - Вы имеете точно те же числа что и в MSVC и др. (там где все устраивает). Это просто "трусы линяют" как в старом анекдоте  Улыбающийся
Записан
Dimon-st
Гость
« Ответ #20 : Июля 19, 2010, 21:17 »

Цитировать
Если подставить vStep и раскрыть скобки, то получим vFirstValue = vFirst;
Логично, только вот компьютер раскрывать скобки и упрощать выражения не умеет. При изменении vCount=101 (вместо vCount=11) в алгоритме изменяются значения vStep и vFirstValue по приведенным выше формулам. И погрешность закравшаяся в vStep приводит к изменению vFirstValue, хотя по идее она не должна меняться.
Записан
Dimon-st
Гость
« Ответ #21 : Июля 19, 2010, 21:39 »

Цитировать
Это просто "трусы линяют" как в старом анекдоте
Ссылочку на анекдот не дадите ? Просто интересно стало. Улыбающийся
(извиняюсь, что не по теме)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июля 20, 2010, 13:49 »

Ссылочку на анекдот не дадите ? Просто интересно стало. Улыбающийся
http://prikol.i.ua/user/1920258/?p=3
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 23.