Реальные числа в Go

Как работать с действительными числами в Go?

Например:

(627.71/640.26)^(1/30) = 0.999340349 --> correct result

но с Go:

fmt.Print(math.Pow((627.71 / 640.26), (1 / 30))) = 1 --> wrong

Чтобы устранить что-то вроде этого, вы можете посмотреть на каждую часть своих расчетов и посмотреть, дает ли это ожидаемый результат, быстро вы придете к 1 / 30, который даст вам ноль.

Akavall 31.10.2018 05:14

Обратите внимание, что наилучшее приближение к действительному числу (для любых реальных чисел) в Go - это mathh / big.Float, а следующие менее точные - это float64s, которые вы использовали. Но никогда думает о них как о настоящих!

Volker 31.10.2018 05:45
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте деление с плавающей точкой (действительное), а не целочисленное. Например,

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Print(math.Pow((627.71 / 640.26), (1.0 / 30.0)))
}

Детская площадка: https://play.golang.org/p/o7uVw9doaMu

Выход:

0.999340348749526

package main

import "fmt"

func main() {
    fmt.Println(1 / 30)     // integer division
    fmt.Println(1.0 / 30.0) // floating-point division
}

Детская площадка: https://play.golang.org/p/VW9vilCC9M8

Выход:

0
0.03333333333333333

The Go Programming Language Specification

Integer literals

Floating-point literals

Arithmetic operators

Integer operators

For two integer values x and y, the integer quotient q = x / y and remainder r = x % y satisfy the following relationships:

x = q*y + r  and  |r| < |y|

with x / y truncated towards zero ("truncated division").

Другие вопросы по теме