为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Go没有计算整数绝对值的函数?

为什么Go没有计算整数绝对值的函数?

Go
有只小跳蛙 2023-07-17 14:38:01
Go中为什么没有直接计算整数数据类型绝对值的函数?目前,所有整数值都必须类型转换为float64,然后传递给math.Abs(),它返回 a float64,它再次必须类型转换为整数。此代码会引发./prog.go:12:39: cannot use x (type int64) as type float64 in argument to math.Abs错误,因为 Go 是静态类型语言,因此它不允许不同的数据类型:package mainimport (    "fmt"    "math")func main() {    fmt.Println("Hello, playground")    var x int64 = -10        fmt.Println("Abolute value ", math.Abs(x))  }
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

从 Go 的常见问题解答中,

标准库的目的是支持运行时、连接到操作系统并提供许多 Go 程序所需的关键功能,例如格式化 I/O 和网络。它还包含对 Web 编程很重要的元素,包括加密以及对 HTTP、JSON 和 XML 等标准的支持。

没有明确的标准来定义包含的内容,因为很长一段时间以来,这是唯一的 Go 库。然而,有一些标准定义了今天要添加的内容。

标准库中新增的内容很少,而且纳入的门槛很高。标准库中包含的代码需要承担大量的持续维护成本(通常由原作者以外的人承担),受到 Go 1 兼容性承诺的约束(阻止修复 API 中的任何缺陷),并且受到 Go 版本的约束安排,防止错误修复快速提供给用户。

大多数新代码应该位于标准库之外,并且可以通过 go 工具的 go get 命令访问。这样的代码可以有自己的维护者、发布周期和兼容性保证。用户可以在 godoc.org 上找到软件包并阅读其文档。

对于创建 math 包的 float 函数的整数版本是多么容易,Go 团队成员Russ Cox 曾经打趣道:

Ceil、Floor 和 Trunc 甚至更容易!

一个合理的解释是,由于这个函数编写起来很简单(如果 x < 0,x = -x),因此它不符合包含标准。与浮动版本比较:

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

这是有用但也不明显的,这是将其包含在标准库中的一个令人信服的理由。


查看完整回答
反对 回复 2023-07-17
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

绝对值只是绝对差[1]的一种特殊情况,其中第二个值为零。这是整数的绝对值函数,以及整数的绝对差函数。Bonus 是无符号整数的绝对差函数:


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

}

https://wikipedia.org/wiki/Absolute_difference


查看完整回答
反对 回复 2023-07-17
?
浮云间

TA贡献1829条经验 获得超4个赞

虽然没有标准功能,但您始终可以自己编写或使用第三方解决方案。该包包含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)


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信