№/6 не может быть представлен точно на компьютере (он также не может быть представлен точно на бумаге). Это приведет к тому, что результат будет немного отброшен. Используя «bc», высокоточный калькулятор Unix (примечание: я не знаю, насколько это точно для синуса и косинуса), я считаю, что фактическое значение в вашей программе будет π/6 + ε, где ε - около 5.3604 x 10 -17. Используя формулу для sin (x + y), ожидаемым результатом должно быть sin π/6 cos ε + sin ε cos π/6. cos ε составляет около 1 - 10 -33, поэтому этого разницы будет недостаточно, чтобы повлиять на результат. Однако sin ε cos π/6 составляет около 4,64 × 10 -17. Таким образом, фактический результат должен быть примерно 0,4999999999999999535774978 вместо 0,5.
Этот результат не будет представлен точно в double
. Поскольку double
имеет мантисс из 52 бит, числа, значения которых> = 0,25 и < 0,5, могут быть представлены числами, которые отключены на целых 2 -54. double
, используемый для представления этого результата, будет 0.499999999999999944488848768742172978818416595458984375. Когда это будет напечатано с помощью System.out.println
, оно остановится после того, как будет напечатано определенное количество знаков после запятой, поэтому это будет усечено до 0,4999999999999999994, что является результатом, который вы видите. (Количество отображаемых цифр обсуждается в [http://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#toString-double-](this javadoc).
Пожалуйста, прочитайте [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –
Извините, я не подумайте, что это дубликат этого вопроса. Обычная «математика с плавающей запятой» объясняет, почему определенные цифры типа «0,1» не могут быть представлены точно. Но 0,5 ** ** можно представить точно, поэтому ответ на этот вопрос должен быть чем-то другим. – ajb
@ajb Да, 0,5 можно представить точно, но pi/6 не может. Итак, мы преобразуем точный 30 в неточный pi/6, а затем найдем синус, который не совсем равен 0,5. –