F # точный расчет с десятичными знаками? - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь сделать точный расчет с помощью чисел с плавающей запятой, таких как

let pi = double (22/7)

printfn "%f" (cos(2.00*pi*1.00/2.00))
// output: -0.989992

На калькуляторе я получаю -1, поэтому он может правильно округляться вверх и вниз, однако, когда я делаю это в F # Iполучить результат / вывод: -0,989992, который близок к -1, но как мне получить вывод -1, чтобы он правильно округлялся вверх и вниз?

Я пытался прочитать о теме, и мне кажется, что мне нужно импортировать модуль, может ли это быть правдой?

enter image description here

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Ваш расчет отключен не из-за ошибки округления, а потому, что 22/7 - это очень слабая аппроксимация значения π.

  • 22/7 = 3,142857142857 ...
  • π = 3,14159265358979 ...
  • 22/7 - π = 0,00126448927 ...

Wolfram Alpha использует намного лучшее приближение π, чем 22/7, поэтому ваши вычисления показывают отличные результаты от Wolfram Alpha.

Вместо того, чтобы делать let pi = double (22/7), вы должны просто использовать System.Math.PI (например, let pi = System.Math.PI).Это даст вам точное значение для (cos(2.00*pi*1.00/2.00)).Нет необходимости в округлении.

См. документы для Math.PI для более подробной информации.

0 голосов
/ 29 сентября 2018

Так что у вопроса есть несколько проблем.

  1. Как отмечают другие, 22/7 - это лишь приблизительное значение PI
  2. . Также, let pi = double(22/7) приводит к pi = 3.0.Это потому, что 22/7 является целочисленным делением в F #.
  3. При сравнении с вольфрамом выражение использует лучшее приближение PI, чем 3,0, означающее, что результат F # отличается от вольфрама довольно значительно

Когдапросим Вольфрама и F # вычислить одно и то же выражение: cos(3) результат будет следующим:

F #: cos 3.0 => -0.989992496600445 Вольфрам: cos(3) => -0.98999249660044545727157279473126130239367909661558832881

Вольфрам вычисляет больше десятичных чисел, но мы видим, что числа отличаются только на > 1e-15

Когда мы спрашиваем F # и Вольфрама, с чем они (pi) согласуются:

F #:cos System.Math.PI => -1.0 Вольфрам: cos(pi) => -1

0 голосов
/ 28 сентября 2018

Я нашел путь, извините!Вам нужно использовать System.Math.Round.Нет необходимости импортировать что-либо, поскольку оно уже встроено.

Т.е.: System.Math.Round (System.Math.Round (cos ((2.00 * pi * 2.00 / 2.00)), 0))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...