0 голосов
 
929 просмотров
28.02.2019 / 14:32  vasilevnick

Какая реализация acos точнее: в Go или C?

В Go и C функция acos выдаёт разные результаты для одного числа. Вот ремонстрация:

Код Go:

  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "math"
  6. )
  7.  
  8. func main() {
  9.     fmt.Printf("Go's math.Acos(): %.64g\n", math.Acos(0.99999999667534597504355009522925001874682493507862091064453125))
  10. }

Код C:

  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. int main(void) {
  5.     printf("C's acosl(): %.64Lg\n", acosl(0.99999999667534597504355009522925001874682493507862091064453125L));
  6.     return 0;
  7. }

Результат:

  1. $ go run test.go
  2. Go's math.Acos(): 8.1543289164986987316297017969191074371337890625e-05
  3. $ cc test.c
  4. $ ./a.out
  5. C's acosl():      8.154328944552912304147555239250584613319716709156637080013751984e-05

Погрешность для меня важна, потому что в моей программе результат acos() умножается на большое число. И погрешность, следовательно, возрастает

Запускал на GNU/Linux x86_64
Изм. от 28.02.2019 / 14:35
Ответы
 
2 голоса
 
# 1.03.2019 / 21:12  Ginosaji
Посчитал на Java с помощью библиотеки https://github.com/eobermuhlner/big-math до тысячного знака:
  1. MathContext context = new MathContext(1000);
  2. BigDecimal result = BigDecimalMath.acos(new BigDecimal("0.99999999667534597504355009522925001874682493507862091064453125"), context);
Все первые знаки после запятой совпали с результатом WolframAlpha, что выше.
1.03.2019 / 21:15  Пользователь удалён
Спасибо! :-)
 
1 голос
 
# 28.02.2019 / 16:06  Arigato
Ответ WolframAlpha:
8.154328944552912304161662034156429926586937855843215710316199041224552457393664984654236665142869956049169441183902135995526231173852181084973679593287115088060402315760297978556003844935481566286656372350027966615679189625e-05

  - в C расхождение начинается с 20-го знака после запятой,
  - в Go — с 8-го.
28.02.2019 / 16:09  Пользователь удалён
«go опять соснул»

Спасибо! :)
 
0 голосов
 
# 3.03.2019 / 13:00  Naik
А Arity калькулятор выдал другие знаки после 14го..((
https://play.google.com/store/apps/details?id=ua.naiksoftware.aritymod

но получается все равно самописная левая либа точнее Go в два раза 😀
Изм. Naik от 3.03.2019 / 13:01
 
0 голосов
 
# 28.02.2019 / 15:56  aNNiMON
Если верить калькулятору гугла и онлайн калькулятору Desmos, то всë же в Go реализация точнее:
acos(0.99999999667534597504355009522925001874682493507862091064453125) =
8.15432891 × 10-5 rad
2.03.2019 / 18:31  SeTSeR
А на чем написан Desmos?
Всего: 4

Реклама

Мы в соцсетях

tw tg yt gt