Go 中任意精度常量的目的是什么?

2024-02-22

Go 具有任意大小和精度的无类型精确数值常量。这spec requires https://golang.org/ref/spec#Constants所有编译器都支持至少 256 位的整数,以及至少 272 位的浮点数(尾数为 256 位,指数为 16 位)。因此,编译器需要忠实、准确地表示如下表达式:

const (
    PI       = 3.1415926535897932384626433832795028841971
    Prime256 = 84028154888444252871881479176271707868370175636848156449781508641811196133203
)

这很有趣......但我找不到任何方法来实际使用任何超过 64 位具体类型最大精度的常量int64, uint64, float64, complex128(这只是一对float64值)。甚至标准库大数类型 https://golang.org/pkg/math/big/ big.Int and big.Float不能从大型数字常量初始化——它们必须从字符串常量或其他表达式反序列化。

底层机制相当明显:常量仅在编译时存在,并且必须强制为可在运行时表示的某个值才能在运行时使用。它们是仅存在于代码和编译期间的语言构造。您无法在运行时检索常量的原始值;它不存储在编译后的程序本身的某个地址处。

所以问题依然存在:当大量常量无法在实践中使用时,为什么该语言要如此强调支持它们呢?


TLDR;Go 的任意精度常量使您可以使用“真实”数字而不是“盒装”数字,因此可以缓解溢出、下溢、无穷大极端情况等“伪影”。您可以以更高的精度进行工作,并且只需将结果转换为有限精度,从而减轻中间误差的影响。

Go 博客:常量: https://blog.golang.org/constants(强调是我回答你的问题)

数字常量存在于任意精度的数字空间中;它们只是普通数字。但是,当将它们分配给变量时,该值必须能够适合目标。我们可以声明一个非常大的值的常量:

const Huge = 1e1000

——毕竟,这只是一个数字——但我们无法分配它,甚至无法打印它。该语句甚至无法编译:

fmt.Println(Huge)

错误是“constant 1.00000e+1000 溢出 float64”,这是正确的。But Huge可能有用:我们可以在具有其他常量的表达式中使用它,并且如果结果可以在 a 的范围内表示,则可以使用这些表达式的值float64.该声明,

fmt.Println(Huge / 1e999)

prints 10,正如人们所期望的那样。

以相关的方式,浮点常量可能具有非常高的精度,因此涉及它们的算术更加准确。中定义的常量math https://golang.org/pkg/math包中给出的数字远多于可用的数字float64。这是定义math.Pi:

Pi    = 3.14159265358979323846264338327950288419716939937510582097494459

当将该值分配给变量时,一些精度将会丢失;该作业将创建float64 (or float32) 最接近高精度值的值。这个片段

pi := math.Pi
fmt.Println(pi)

prints 3.141592653589793.

有如此多的可用数字意味着像这样的计算Pi/2或者其他更复杂的计算可以在结果被分配之前具有更高的精度,使得涉及常量的计算更容易编写而不会损失精度。这也意味着不存在浮点极端情况,如无穷大、软下溢和NaNs 出现在常量表达式中。(除以常量零是一个编译时错误,当一切都是数字时,就不存在“不是数字”这样的事情。)

参见相关:Go 如何对常量进行算术运算? https://stackoverflow.com/questions/38982278/how-does-go-perform-arithmetic-on-constants/38982889#38982889

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中任意精度常量的目的是什么? 的相关文章

  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • Guice:Binder#bindConstant() 和 Binder#bind() 之间的区别 ... toInstance

    我想问一下有什么区别 bindConstant annotatedWith Names named keepAliveInterval to 60 and bind Integer TYPE annotatedWith Names name
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 匿名结构和空结构

    http play golang org p vhaKi5uVmm http play golang org p vhaKi5uVmm package main import fmt var battle make chan string
  • 在Delphi 7中,为什么我可以给const赋值?

    我将一些 Delphi 代码从一个项目复制到另一个项目 发现它在新项目中无法编译 但在旧项目中可以编译 代码看起来像这样 procedure TForm1 CalculateGP const Price money 0 begin Pric
  • 从自定义结构/类型公开通用值

    我的一个项目有一个值类型 结构 表示视频格式的自定义标识符字符串 在本例中 它将包含内容类型字符串 但这可能会有所不同 我使用了一个结构体 因此它在传递时可以是强类型的 并对初始字符串值执行一些健全性检查 public struct Vid
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • C++中const对象位于哪个内存区域? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 模板中的 bson.ObjectId

    我有一个具有 bson ObjectId 类型的结构 例如如下所示 type Test struct Id bson ObjectId Name string Foo string 我想在 html 模板中呈现它 Name Food a h
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • GOMAXPROCS 默认值是多少?

    不设置同名环境变量时是否保证GOMAXPROCS设置为1 此代码显示的值 package main import runtime fmt func getGOMAXPROCS int return runtime GOMAXPROCS 0
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • Rails:表单提交后访问视图中的参数

    在我的 Rails 3 2 项目中 我有一个表单来创建一个新站点new html erb in app views sites div class field br div div class actions div 然后create函数于
  • IntelliJ找不到具体的方法

    我在以下代码中遇到编译错误 我不知道如何修复 String path document txt File file new File path Files readString file toPath cannot find symbol
  • Android:使用 xml 布局的日期选择器

    我尝试使用 xml 代码显示日期选择器 但它没有显示任何东西 我可以只通过java代码显示DatePicker吗 datePickerExample java public class datePickerExample extends A
  • 是否可以使用活动记录为表定义复合主键? [复制]

    这个问题在这里已经有答案了 我在没有 Rails 的 ruby 项目中使用 ActiveRecord 我需要为表定义复合主键 通常迁移会自动创建主键 是否可以使用活动记录为表定义自己的复合主键 有一些宝石可以赋予你这种能力 例如复合主键 h
  • 在 d3 中的图表上渲染之前简化线条

    我正在尝试绘制从蜂箱实时收集的数据 我们计划每 5 分钟收集一次数据 因此一年内将有大约 100 000 个数据点 我想设置一个图表来绘制数据 并在每次数据库更改时让新数据进入图表 使用 Meteor 我有一个简单的模型datacomb m
  • 如何使用 Python API 获取我在盈透证券的账户头寸?

    编辑 我找到了有关错误消息的解决方案 这是 IB 的 API 上的错误 我在下面作为答案显示的代码对于那些寻找干净的解决方案来从 IB 账户读取头寸和资产净值的人来说应该很有用 原来的问题 参见下面的解决方案 在此留下原始问题以获取上下文
  • React Apollo GraphQL 搜索/过滤

    我有一个使用 Apollo 客户端的带有 GraphQL 服务器的 React 项目 我试图弄清楚如何根据搜索文本和过滤选择更改查询结果 如果有人可以查看我的代码并给我一些帮助 我将不胜感激 对所有代码感到抱歉 我想也许它们都是相关的 服务
  • python:安装日志记录模块[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有 python 3 5 尝试在 PyCharm 中安装日志记录包 但出现错误 安装包 logging 时发生错误 确保您使用此包支持的
  • 改造 JSON 反序列化对象的 $ref 对其原始副本的引用

    我使用 Microsoft Net 和 Breeze 来获取 API 并且使用 Retrofit 得到的结果嵌套了重复的相同对象 例如 EmployeeJob 具有 Customer 导航属性 因此 API 结果如下所示 Id 1 Cust
  • PHP 中的会话超时:最佳实践

    两者之间的实际区别是什么session gc maxlifetime and session cache expire 假设我希望用户会话在 15 分钟无活动后 而不是首次打开后 15 分钟 无效 其中哪一项对我有帮助 我也知道我能做到se
  • Rails:activeadmin 覆盖创建操作

    我有一个 activeadmin 资源 它具有 own to user 关系 当我在活动管理中创建模型的新实例时 我想将当前登录的用户关联为创建该实例的用户 我想这是相当标准的东西 所以 我让它工作 controller do def cr
  • 直接在 PhpStorm 中运行 PHP 脚本

    如何在 PhpStorm 中立即运行当前的 PHP 文件 如何像 PyCharm 一样在 PHPstorm 中执行 PHP 命令 在编辑器中右键单击 选择Run 或按 ctrl shift f10 用于命令行脚本执行 如果您想在网络服务器上
  • WPF ItemsControl:将项目的类型限制为特定类型

    我正在创建一个 WPF 自定义控件来作为练习 以在 VS 面板中显示日志消息 错误 警告 消息 该控件是一个 ItemControl 每个项目都是一条要显示的消息 但我必须将消息分类到正确的类别中 因此我需要每个项目公开一些内容 可能是一个
  • 在编写 WinAPI 应用程序时是否应该使用匈牙利表示法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近开始学习 Win32 API 我讨厌匈牙利表示法 变量名中那些愚蠢的前缀 使代码看起来丑陋且几乎不可读 但是正如您可能知道的那样 它绝对无
  • C++中make_shared和普通shared_ptr的区别

    std shared ptr p1 std make shared foo std shared ptr p2 new Object foo 许多谷歌和 stackoverflow 帖子都在这方面 但我无法理解为什么make shared比
  • 在 C 中将可变长度数组声明为全局变量

    如何将可变长度数组声明为全局变量 当在扫描长度之前在函数中声明可变长度数组时 它会编译但不会运行 它给出了分段错误 当相同的声明语句移动到扫描语句下方时 它运行良好 如果我们想要一个全局可用于所有函数的可变长度数组 我们该怎么做呢 这里的问
  • 将 XAML PathGeometry 转换为 WPF PathGeometry

    我想要由 LineSegment 组成的 PathGeometry 所以 我使用第一个代码 但它是错误的 PathGeometry temp PathGeometry Geometry Parse
  • 使用 textFileStream 的 Python Spark Streaming 示例不起作用。为什么?

    我使用spark 1 3 1和Python 2 7 这是我第一次体验 Spark Streaming 我尝试使用 Spark Streaming 从文件中读取数据的代码示例 这是示例的链接 https github com apache s
  • pandas 系列的 groupby 不起作用

    我无法对 pandas Series 对象进行 groupby 数据帧很好 但我似乎无法对系列进行分组 有人能够让它发挥作用吗 gt gt gt import pandas as pd gt gt gt a pd Series 1 2 3
  • Go 中任意精度常量的目的是什么?

    Go 具有任意大小和精度的无类型精确数值常量 这spec requires https golang org ref spec Constants所有编译器都支持至少 256 位的整数 以及至少 272 位的浮点数 尾数为 256 位 指数