LINUX.ORG.RU

История изменений

Исправление AKonia, (текущая версия) :

  1. вещественные числа на ПК имеют запас точности и все операции выполняются с некоторой степенью точности(грубо говоря по числу знаков) и могут в дальнейшем ещё и округлятся

  2. как пример сложение 6.1232339957368e-17(мой результат косинуса) с нулём то совершенно логично получим 6.1232339957368e-17, но если мы будем складывать с 1.0, то прежде всего 6.1232339957368e-17 будет выровнено по порядку(степени) под 1.0, но из-за этого оно будет терять знаки после точки грубо говоря будет такая последовательность переходов

6.1232339957368e-17
0.6123233995736e-16
0.0612323399573e-15
0.0061232339957e-14
0.0006123233995e-13
...
0.0000000000006e-04
0.0000000000000e-03
...
0.0000000000000e-00 -> готово, число того же 
порядка что и 1.0e00 и вот теперь складывая с ним мы получим 1.0, логика отброса состоит в том, чтобы отбрасывать наимение значащие части числа

Т.е. вся веселуха произошла из-за ограниченной точности double и арифметики, которая по сути требует для например сложения и вычитания приравнивать порядки и уже после выполнять действия, в остальном как уже рекомендовали стоит посмотреть статьи на данную тему или как вариант кусочек главы по этой теме из книги «Игровой движок» 3-е издание

Исходная версия AKonia, :

  1. вещественные числа на ПК имеют запас точности и все операции выполняются с некоторой степенью точности(грубо говоря по числу знаков) и могут в дальнейшем ещё и округлятся

  2. как пример сложение 6.1232339957368e-17(мой результат косинуса) с нулём то совершенно логично получим 6.1232339957368e-17, но если мы будем складывать с 1.0, то прежде всего 6.1232339957368e-17 будет выровнено по порядку(степени) под 1.0, но из-за этого оно будет терять знаки после точки грубо говоря будет такая последовательность переходов

6.1232339957368e-17
0.6123233995736e-16
0.0612323399573e-15
0.0061232339957e-14
0.0006123233995e-13
...
0.0000000000006e-04
0.0000000000000e-03
...
0.0000000000000e-00 -> готово, число того же 
порядка что и 1.0e00 и вот теперь складывая с ним мы получим 1.0

Т.е. вся веселуха произошла из-за ограниченной точности double и арифметики, которая по сути требует для например сложения и вычитания приравнивать порядки и уже после выполнять действия, в остальном как уже рекомендовали стоит посмотреть статьи на данную тему или как вариант кусочек главы по этой теме из книги «Игровой движок» 3-е издание