将 10 的幂写成常数
Writing powers of 10 as constants compactly
我正在阅读最近发布的 The Go Programming Language,到目前为止我一直很高兴(Brian Kernighan 是其中一位作者,无论如何我不会期待除了卓越之外的任何东西)。
我在第 3 章遇到了以下练习:
Exercise 3.13
Write const
declarations for KB, MB, up through YB as compactly as you can.
(注意:在此上下文中,KB、MB 等表示 1000 的幂)
前面有一节介绍了 iota
作为有用的常量生成器机制;特别是,上一段显示了一种将 1024 的幂定义为常量的简洁方法:
const (
_ = 1 << (10 * iota)
KiB
MiB
GiB
TiB
PiB
EiB
ZiB
YiB
)
关于 10 的幂,作者进一步提到了这一点:
The iota
mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.
我正在为这个练习苦苦挣扎,因为看起来预期的解决方案比简单地手工拼出 1000 的幂要复杂一些(特别是因为它出现在 iota
之后)。我觉得有一些巧妙的方法可以做到这一点,即以微妙的方式结合使用 iota
和其他东西。
我想找到一种系统的方法来从 1024 的每次幂中减去“多余”的量以获得 1000 的幂,但它使我无处可去。然后我查看了二进制表示,试图推断出 iota
可能有用的一般模式,但同样,我一无所获。
我真的看不出在没有求幂运算符的情况下如何从单个递增值 (iota
) 中生成 1000 的幂。
有什么想法吗?
我会说这是不可能的,因为你想要的是表示一个函数 10^(3i)
其中 i
是一个正整数作为某个函数 f(i)
,其中 f
是基本 go 函数 (+, -, /, *) 的复合函数。
2^(10i)
之所以成为可能,只是因为 go 引入了另一个初等函数整数求幂。因此,如果 1 << y
允许 y 浮动,您将能够修改代码以使用 1 << (log2(10) * 3 * i)
。这会起作用,因为这等同于求解 10^(3i) = 2^y
。取双方的 log2 y = log2(10) * 3 * i
.
但遗憾的是位移位是一个整数运算。
你自己引用的:
The iota
mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.
作者不希望您在不知道任何方法的情况下仍然找到方法。作者希望您为 KB、MB 等创建常量声明。尽可能紧凑。
使用浮点文字
这是一个紧凑的方法。这利用 Floating-point literals 和指数部分。想一想:写 1e3
比写 1000
还要短(更不用说其他的了……)。
同时它将所有标识符压缩为一个常量规范,因此我们将 =
符号减少为 1。
在这里,就一行(67个字符没有空格):
const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )
请注意,由于我们使用了浮点文字,常量标识符(KB
、MB
...)表示浮点常量,即使文字的小数部分为零。
使用整数文字,使用KB
作为乘数
如果我们想要无类型的整数常量,我们必须为KB
写1000
。为了得到下一个,我们会自动转向将前一个标识符乘以 1000
。但请注意,我们还可以将下一个与 KB
相乘,因为它恰好是 1000
- 但短了两个字符 :).
下面是无类型整数常量声明(77 个字符,没有空格):
const (KB,MB,GB,TB,PB,EB,ZB,YB = 1000,KB*KB,MB*KB,GB*KB,TB*GB,PB*KB,EB*KB,ZB*KB)
(很抱歉删除了空格,但希望它能排成一行。)
使用整数文字,使用额外的 x
常量作为乘数
如果你还引入一个 1 个字符长度的常量 x
,你甚至可以从最后一个解决方案中获得 3 个字符,你多次使用它来进行乘法而不是 *KB
:
有一个额外的 x
常量(74 个字符 没有空格):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 1000,x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)
用rune
文字
如果我们将 1000
常量指定为符文常量,我们甚至可以将其缩短一个字符,符文的代码点为 1000
,即 'Ϩ'
- 这少了 1 个字符 :)
使用 rune
文字 'Ϩ'
常量(73 个字符 没有空格):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 'Ϩ',x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)
请注意,这些将是符文常量,但就像所有其他数字常量一样,它们表示任意精度的值并且不会溢出。
我正在阅读最近发布的 The Go Programming Language,到目前为止我一直很高兴(Brian Kernighan 是其中一位作者,无论如何我不会期待除了卓越之外的任何东西)。
我在第 3 章遇到了以下练习:
Exercise 3.13 Write
const
declarations for KB, MB, up through YB as compactly as you can.
(注意:在此上下文中,KB、MB 等表示 1000 的幂)
前面有一节介绍了 iota
作为有用的常量生成器机制;特别是,上一段显示了一种将 1024 的幂定义为常量的简洁方法:
const (
_ = 1 << (10 * iota)
KiB
MiB
GiB
TiB
PiB
EiB
ZiB
YiB
)
关于 10 的幂,作者进一步提到了这一点:
The
iota
mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.
我正在为这个练习苦苦挣扎,因为看起来预期的解决方案比简单地手工拼出 1000 的幂要复杂一些(特别是因为它出现在 iota
之后)。我觉得有一些巧妙的方法可以做到这一点,即以微妙的方式结合使用 iota
和其他东西。
我想找到一种系统的方法来从 1024 的每次幂中减去“多余”的量以获得 1000 的幂,但它使我无处可去。然后我查看了二进制表示,试图推断出 iota
可能有用的一般模式,但同样,我一无所获。
我真的看不出在没有求幂运算符的情况下如何从单个递增值 (iota
) 中生成 1000 的幂。
有什么想法吗?
我会说这是不可能的,因为你想要的是表示一个函数 10^(3i)
其中 i
是一个正整数作为某个函数 f(i)
,其中 f
是基本 go 函数 (+, -, /, *) 的复合函数。
2^(10i)
之所以成为可能,只是因为 go 引入了另一个初等函数整数求幂。因此,如果 1 << y
允许 y 浮动,您将能够修改代码以使用 1 << (log2(10) * 3 * i)
。这会起作用,因为这等同于求解 10^(3i) = 2^y
。取双方的 log2 y = log2(10) * 3 * i
.
但遗憾的是位移位是一个整数运算。
你自己引用的:
The
iota
mechanism has its limits. For example, it's not possible to generate the more familiar powers of 1000 (KB, MB, and so son) because there is no exponentiation operator.
作者不希望您在不知道任何方法的情况下仍然找到方法。作者希望您为 KB、MB 等创建常量声明。尽可能紧凑。
使用浮点文字
这是一个紧凑的方法。这利用 Floating-point literals 和指数部分。想一想:写 1e3
比写 1000
还要短(更不用说其他的了……)。
同时它将所有标识符压缩为一个常量规范,因此我们将 =
符号减少为 1。
在这里,就一行(67个字符没有空格):
const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )
请注意,由于我们使用了浮点文字,常量标识符(KB
、MB
...)表示浮点常量,即使文字的小数部分为零。
使用整数文字,使用KB
作为乘数
如果我们想要无类型的整数常量,我们必须为KB
写1000
。为了得到下一个,我们会自动转向将前一个标识符乘以 1000
。但请注意,我们还可以将下一个与 KB
相乘,因为它恰好是 1000
- 但短了两个字符 :).
下面是无类型整数常量声明(77 个字符,没有空格):
const (KB,MB,GB,TB,PB,EB,ZB,YB = 1000,KB*KB,MB*KB,GB*KB,TB*GB,PB*KB,EB*KB,ZB*KB)
(很抱歉删除了空格,但希望它能排成一行。)
使用整数文字,使用额外的 x
常量作为乘数
如果你还引入一个 1 个字符长度的常量 x
,你甚至可以从最后一个解决方案中获得 3 个字符,你多次使用它来进行乘法而不是 *KB
:
有一个额外的 x
常量(74 个字符 没有空格):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 1000,x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)
用rune
文字
如果我们将 1000
常量指定为符文常量,我们甚至可以将其缩短一个字符,符文的代码点为 1000
,即 'Ϩ'
- 这少了 1 个字符 :)
使用 rune
文字 'Ϩ'
常量(73 个字符 没有空格):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 'Ϩ',x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)
请注意,这些将是符文常量,但就像所有其他数字常量一样,它们表示任意精度的值并且不会溢出。