NormalizeDouble парадокс - страница 11

 
transcendreamer:

а вообще меня напрягает тот факт что рассчитав дробное число, нормализовав его, записав в переменную, потом прочитав и нормализовав снова я получаю хвосты

 например

basis[0]=NormalizeDouble(sum_A,2);

GlobalVariableSet("Equity-"+portfolio_id,basis[0]); 

...

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions synchronized at " + current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

сейчас уже поменял на 

text = "Positions synchronized at " + DoubleToStr(current,2) + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

 и вроде бы хвосты не вылезают, тьфу тьфу

 

Уже писал, повторю - не существует в двоичной системе некоторых чисел. Нет там 0,1 нет 0,3 и многих других. Сколько не пишите double val = NormalizeDouble(0.1434, 1) вы никогда не получите 0,1 просто потому, что нет такого числа.

Например, числа представляются следующим образом:

0.1 = 0.10000000000000001
0.2 = 0.20000000000000001
0.3 = 0.29999999999999999
0.4 = 0.40000000000000002
0.6 = 0.59999999999999998

но
0.125 = 0.125
0.25 = 0.25
0.5 = 0.5

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

И не прибавляется никаких хвостов во время преобразования в строку, они есть там изначально.

 
transcendreamer:

так я вопрос решил свой, можно тему закрывать

solution: нужно делать принудительное округление double даже после нормализации

Неправильное решение. При округлении надо умножить, округлить, разделить. После последнего деления число будет ненормализованным.
 
transcendreamer:

вполне возможно... но с точки зрения конечного результата - хвосты есть!

...

Нет хвостов после нормализации.
 
Integer:
Нет хвостов после нормализации.

По-моему вы вводите человека в заблуждение. Что значит нет хвостов после нормализации? Хвостов может не быть только в строке, которую мы получили из числа и округлили значение (округлили уже в строке, а не в double). А после NormalizeDouble() хвосты есть.

 
Integer:
Неправильное решение. При округлении надо умножить, округлить, разделить. После последнего деления число будет ненормализованным.

Что вы понимаете под нормализацией? Тут stringo говорил, что алгоритм примерно такой:

double NormalizeDouble(double val, int digits)
{
    val *= 10 ^ digits
    округляем к ближайшему целому
    val /= 10 ^ digits
    return val
}
 
pavlick_:

По-моему вы вводите человека в заблуждение. Что значит нет хвостов после нормализации? Хвостов может не быть только в строке, которую мы получили из числа и округлили значение (округлили уже в строке, а не в double). А после NormalizeDouble() хвосты есть.

Ну если вам нравится верить, что я кого-то ввожу в заблуждение  - верьте. Я тут уже всяких повидал, меня не удивите своей "принципиальной" позицией. 
 
pavlick_:

Что вы понимаете под нормализацией? Тут stringo говорил, что алгоритм примерно такой:

Будет намного интересней, что вы подразумеваете под нормализацией.
 
Integer:
Я вам конкретный вопрос а вы воду льёте. Как бы это нормально пояснять и аргументировать свою точку зрения.
 
pavlick_:
Я вам конкретный вопрос а вы воду льёте. Как бы это нормально пояснять и аргументировать свою точку зрения.
Почитать учебники и документацию вслух что ли? Или почитать вслух словарь, про слово "примерно"?
 
Integer:
Почитать учебники и документацию вслух что ли? Или почитать вслух словарь, про слово "примерно"?
Всё понятно, нам говорит не о чем. И лучше не лезьте в разговоры если за слова не отвечаете.
Причина обращения: