P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил
Лучше проверьте самостоятельно на разных примерах, это даст понимание.
Единственное, я делаю не так:
if(delta>0)
а так
if(delta>0.0)
для чисел double. Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных).
Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных).
Некоторые числа можно представить только в виде бесконечной дроби, например, 1/3 в десятичной системе. Но 1/3 имеет не является бесконечной дробью в третичной системе, там она == 0,1. Т.е. в разных системах счисления свои бесконечные дроби. Следовательно, небесконечная дробь в десятичной может быть таковой в двоичной. Например: 0.1, 0.2, 0.3, 0.4, ... не имеют точного представления в двоичном виде. Хоть десять раз вызовите NormalizeDouble, там будет либо 0.199999999..1, либо 0.200000...1. Не знаю, может является новостью.
Сделал когда-то функции для округления снизу и сверху
Может кому-то поможет
Сделал когда-то функции для округления снизу и сверху
Может кому-то поможет
попробуйте получить результат 0.99999999999999999
X = 0.99999999999999999
10*X = 10*0.99999999999999999
10*X-X = 10*0.99999999999999999-0.99999999999999999
9*X = 9*0.99999999999999999
получим 9*X = 9 или X равен 1 (один)
v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000
или 0.99999999999999999 = 1.0
v1 (1.00000000) >= 1.0
Всем спасибо за полезную ветку!
Для себя выбрал решение округлять на 1 цифру больше через NormalizeDouble, а потом обрезать последнюю цифру. Пока что это полностью подходит.
И снова про округление......
подскажите пожалуйста по ситуации (только не кидайте помидорами, я гуманитарий),
имеется такая переменная:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
по идее delta изначально нормализирована,
OrderLots наверное должен возвращать нормализированные даблы,
но каким-то образом иногда в редких случаях я получаю числа вроде 2.775557561562891e-17
то есть это почти нуль но не нуль.......
первый вопрос - это нормально?
второй вопрос - как я понимаю мне достаточно будет вторую нормализацию чтобы хвостов не появлялось?
третий вопрос (предчувствую что я все равно не пойму, но все таки спрошу):
сложение двух нормализованных чисел может давать ненормализованное?
P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил
И снова про округление......
подскажите пожалуйста по ситуации (только не кидайте помидорами, я гуманитарий),
имеется такая переменная:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
по идее delta изначально нормализирована,
OrderLots наверное должен возвращать нормализированные даблы,
но каким-то образом иногда в редких случаях я получаю числа вроде 2.775557561562891e-17
то есть это почти нуль но не нуль.......
первый вопрос - это нормально?
второй вопрос - как я понимаю мне достаточно будет вторую нормализацию чтобы хвостов не появлялось?
третий вопрос (предчувствую что я все равно не пойму, но все таки спрошу):
сложение двух нормализованных чисел может давать ненормализованное?
P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил
P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил
Лучше проверьте самостоятельно на разных примерах, это даст понимание.
Единственное, я делаю не так:
а так
для чисел double. Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных).
Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных).