alibek писал(а):Отображаемое десятичное значение не имеет ничего общего с тем, как это значение хранится в двоичном виде с ограниченной точностью. В двоичном виде с плавающей запятой 0,1666667 отличается от 1/6
Естественно, я понимаю, что никакая натуральная дробь, в знаменателе которой не степень двойки, не может быть представлена конечной двоичной дробью. При этом ещё десятичная запись так же накладывает свои ограничения.
Отсюда я сделал естественный вывод, что в Single и Double такие дроби представлены с разной точностью, а значит не будут равны. Проверил - они оказались неожиданно равны, при этом по десятичной записи неравны.
Следующий вывод - видимо, бейсик перед сравнением приводит типы к Single.
Но такой эксперимент дал неравенство, при равенстве десятичных записей:
- Код: Выделить всё
Dim s1 As Single
Dim s2 As Single
s1 = 1 / 6
s2 = 0.1666667
Debug.Print s1, s2, s1 = s2
Тут уже нет приведения типов, только Single.
Делаю следующий вывод - очевидно, десятичная запись сделана с чрезмерным ограничением кол-ва значащих цифр, предположительно для того, чтобы дроби типа
1/5 выглядели "красиво",
0.2, а не как-то так:
0.20000001.
Тут уже возникла мысль проверить биты, но сначала я сделал более простую проверку, приравнял эти синглы к даблам, точность их десятичной записи многократно выше, поэтому я должен увидеть разницу и без проверки бит. Однако даблы так же оказались неравны при сравнении, а их десятичная запись совпала с записью синглов.
Тут уже я теряюсь, что предположить, разве что оптимизации компилятора, но это даёт тот же результат в отладчике, даже с точками останова на каждой строке, где я просматриваю значения переменных, то есть оптимизации отпадают.
Доберусь до бейсика, проверю биты.
В последней проверке банальная опечатка, я задавал даблы синглами:
Dim d1 As Single