Почему в go нет функции для вычисления абсолютного значения для целочисленного типа данных?

В Go, почему нет функции, которая напрямую вычисляет абсолютное значение для целочисленных типов данных. В настоящее время все целочисленные значения должны быть приведены к типу float64, а затем они должны использоваться в качестве параметра в функции math.Abs(). И он возвращает только тип данных float64, который снова должен быть приведен к целочисленному типу данных.

Например, этот код выдает ошибку, поскольку Go является статически типизированным языком, поэтому не допускает другой тип данных.

./prog.go:12:39: нельзя использовать x (тип int64) как тип float64 в аргументе для math.Abs


import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("Hello, playground")
    var x int64 = -10

    fmt.Println("Abolute value ",math.Abs(x))   
}

person Piyush Singal    schedule 25.08.2019    source источник
comment
Преобразование целых чисел в числа с плавающей запятой для использования пакета math, а затем обратно в целые числа почти никогда не бывает правильным. Единственная причина, по которой большинство простых функций math существует для float64, заключается в том, что числа с плавающей запятой часто имеют ряд угловых случаев (например, включающих NaN и бесконечности), которые раздражают, чтобы быть правильными; целые числа не имеют этих проблем.   -  person Dave C    schedule 26.08.2019


Ответы (3)


Из часто задаваемых вопросов Go,

Стандартная библиотека предназначена для поддержки среды выполнения, подключения к операционной системе и предоставления ключевых функций, которые требуются многим программам Go, таких как форматированный ввод-вывод и работа в сети. Он также содержит элементы, важные для веб-программирования, включая криптографию и поддержку таких стандартов, как HTTP, JSON и XML.

Нет четкого критерия, определяющего, что включено, потому что долгое время это была единственная библиотека Go. Однако есть критерии, которые определяют, что добавляется сегодня.

Новые дополнения к стандартной библиотеке редки, и планка для включения высока. Код, включенный в стандартную библиотеку, требует значительных текущих затрат на обслуживание (часто несут те, кто не является первоначальным автором), на него распространяется обещание совместимости с Go 1 (блокировка исправлений любых недостатков в API) и подлежит выпуску Go. расписания, предотвращая быструю доступность исправлений ошибок для пользователей.

Большая часть нового кода должна находиться за пределами стандартной библиотеки и быть доступной с помощью команды go get инструмента go. У такого кода могут быть свои сопровождающие, цикл выпуска и гарантии совместимости. Пользователи могут найти пакеты и прочитать их документацию на сайте godoc.org.

Член команды Go Расс Кокс однажды пошутил,

Ceil, Floor и Trunc еще проще!

Разумной интерпретацией было бы то, что, поскольку эту функцию легко написать (если x ‹ 0, x = -x), она не соответствует планке для включения. Сравните с версией с плавающей запятой:

func Abs(x float64) float64 {
    return Float64frombits(Float64bits(x) &^ (1 << 63))
}

Это полезно, но также и неочевидно, что является веской причиной для включения его в стандартную библиотеку.

person cafster    schedule 25.08.2019

Абсолютное значение — это всего лишь частный случай абсолютной разности [1], где второе значение равно нулю. Вот функция абсолютного значения для целых чисел, а также функция абсолютной разности для целых чисел. Бонусом является функция абсолютной разности для целых чисел без знака:

package math

func absInt(x int) int {
   return absDiffInt(x, 0)
}

func absDiffInt(x, y int) int {
   if x < y {
      return y - x
   }
   return x - y
}

func absDiffUint(x, y uint) uint {
   if x < y {
      return y - x
   }
   return x - y
}
  1. https://wikipedia.org/wiki/Absolute_difference
person Steven Penny    schedule 06.07.2021

Хотя стандартной функции нет, вы всегда можете написать ее сами или воспользоваться сторонним решением. Этот пакет содержит Abs функции для всех встроенных целочисленных типов со знаком. Использование (после go get):

import (
    "fmt"
    "github.com/adam-lavrik/go-imath/i64" // Functions for i64 type
)
...
x := int64(-2)
fmt.Println(i64.Abs(x)) // Output: 2
x = i64.Minimal // Minimal negative value of int64, has no positive pair
fmt.Println(i64.Absu(x)) // Output: 9223372036854775808 (result is converted to uint64)
person LoveRick    schedule 04.01.2020