Здравствуйте, avpavlov, Вы писали:
A>Здравствуйте, msk78, Вы писали:
M>>Будет накапливаться погрешность. А это не всегда приемлемо. M>>double d; M>>for (d = 0.0; d < 1000.0; d += 0.01) ; M>>Console.WriteLine(d); M>>--------------------- M>>Output: d оказалось больше тысячи! M>>1000,00999999924 M>>Press any key to continue . . .
A>В приведённом примере d обязано быть больше тысячи
A>
A>for (int i=0; i < 10; i++);
A>Console.WriteLine(d);
A>
Здравствуйте, koandrew, Вы писали:
D>>Бабло ни в коем случае нельзя хранить в double. Бабло надо хранить исключительно в unsigned long long. K>В правильных языках для хранения бабла существуют типы данных с фиксированной точкой — вот в них бабло и надо хранить
Целочисленная арифметика граздо быстрее и эффективнее и в плане хранения тоже. Более того, никто не обещает, что в валюте "штука" вообще есть что-либо после запятой.
И терминальные устройство зачастую оперируют именно целым числом. Но вообще всё на самом деле зависит от задачи и то что с этими суммами делать. В оперднях может и имеет смысл использовать десятичные типы — а в онлайн процессингах — никак нет, проверено практикой.
Здравствуйте, koandrew, Вы писали:
K>В правильных языках для хранения бабла существуют типы данных с фиксированной точкой — вот в них бабло и надо хранить
Только вот, как нужно считать проценты, любые банковские или по ставкам налогов, или просто делить, например, сумму на количество, всплывают всё те же проблемы, что и при использовании double.
vog>int start()
vog>{
vog> double p;
vog> for(p=1.22;p<1.28;p+=0.01)
vog> Alert("Докупился по цене", p ,"пипс");
vog>}
Для начала, все эти числа (1.22, 1.28, 0.01) в double непредставимы точно...
Так что суммы лучше просто в __int64 в центах выражать и не страдать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
_>>Потому что существуют неточности. И если шаг 0.1 можно использовать, то 0.333333333333333 уже может привести к проблемам.
НС>Хинт — основание в double хранится в двоичном виде, и иррациональные числа для двоичной и десятичной системы не совпадают.
Иррациональные совпадают, конечно, но в целом мысль верная
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Deprivator, Вы писали:
LVV>>В Паскале и его наследниках: Модула-2, Оберон, Компонентный паскаль... D>так це ж разве языки?!
Они по крайней мере на машинный код в текстовом редакторе не похожи.
Здравствуйте, vog, Вы писали:
vog> Человек вторую неделю осваивает программирование, поэтому ему непонятно. ... поэтому в Си сделали циклы с типом int. А вы что думаете?
vog>int start()
Чел mql4 штурмует, а ты его про си грузишь. нэ хорошо.
Здравствуйте, alzt, Вы писали:
A>Здравствуйте, andyag, Вы писали:
vog>>>В каком языке есть цикл for с типом double? Так, сам себе отвечаю — в Матлабе есть )) А еще? A>>C, C++, C#, Java. Я бы скорее задал вопрос — в каком языке его нет.
A>В языках, которых нет циклов и типа дабл.
Я так понимаю, это про арифмометр имени Феликса Эдмундовича Дзержинского? Видел такой в детстве )))
Здравствуйте, koandrew, Вы писали:
K>Здравствуйте, Dair, Вы писали:
D>>Бабло ни в коем случае нельзя хранить в double. Бабло надо хранить исключительно в unsigned long long.
K>В правильных языках для хранения бабла существуют типы данных с фиксированной точкой — вот в них бабло и надо хранить
А ещё лучше бабло хранить не в языках, а в реальных ценностях типа нефти/золота
Здравствуйте, MxMsk, Вы писали:
B>>О, да. B>>Написать в комментах, что для диапазона [1.22 ; 1.28) работает, а для других — тестируйте сами. MM>Угу, я уже понял, что никто здесь в управляющих переменнах цикла никогда числа с плавающей запятой не использует.
Стараются не использовать, ес-но.
MM>А то не дай Бог, цикл превратиться в бесконечный.
Чаще всего набегает банальная погрешность. Размеров вплоть до нескольких шагов цикла.
MM>О! А еще по int-у тоже нельзя цикл гонять, вдруг за границу выйдем. Как страшно жить.
По инту можно и нужно. Диапазон надо знать, любая платформа дает максимальные и минимальные значения числовых типов. Гоняй масштабированный цикл на int, а внутри получай каждый раз из него double, и будет тебе щастье с минимумом погрешностей.
Здравствуйте, pagid, Вы писали:
P>Только вот, как нужно считать проценты, любые банковские или по ставкам налогов, или просто делить, например, сумму на количество, всплывают всё те же проблемы, что и при использовании double.
Не всплывают, если внимательно читать требования. Потому что куда девать ошибки округления там должно оговариваться.
Здравствуйте, vog, Вы писали:
A>>В языках, которых нет циклов и типа дабл.
vog>Я так понимаю, это про арифмометр имени Феликса Эдмундовича Дзержинского? Видел такой в детстве )))
Была в свое время такая система — Gupta Centura, так вот в том местном языке единственный цикл был while.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Не всплывают, если внимательно читать требования. Потому что куда девать ошибки округления там должно оговариваться.
Должны оговариваться, но внимания эти особенности требуют куда, как больше, чем возможное (согласен, конечно — нежелательное) использование double для денег.
Здравствуйте, GarryIV, Вы писали:
D>>>во-вторых, писать такой цикл (для плавающей точки) с фиксированным шагом это дурной тон, потому что такой цикл рискует незаметно превратиться в бесконечный. MM>>Каким образом он превратится в бесконечный? GIV>для double вполне может быть что x + 0.1 == x будет true
если что, там в условии < а не ==, так что бесконечным он никак не станет
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Centaur, Вы писали:
_>>>Потому что существуют неточности. И если шаг 0.1 можно использовать, то 0.333333333333333 уже может привести к проблемам. НС>>Хинт — основание в double хранится в двоичном виде, и иррациональные числа для двоичной и десятичной системы не совпадают. C>Иррациональное число — это такое, которое непредставимо в виде дроби n/m для целых n, m, и это от основания системы счисления не зависит.
А если основание 3, то 1/3 можно точно представить будет?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]