Хобрук: Ваш путь к мастерству в программировании

Реальные числа в 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
31.10.2018

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

Ответы:


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

Спецификация языка программирования Go

Целые литералы

литералы с плавающей запятой

Арифметические операторы

Целочисленные операторы

Для двух целых значений x и y целочисленное частное q = x / y и остаток r = x % y удовлетворяют следующим соотношениям:

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

с усечением x/y в сторону нуля («усеченное деление»).

31.10.2018
Новые материалы

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..