C# 以升序遍历所有可表示的小数
如果我取一个C# 以升序遍历所有可表示的小数,c#,floating-point,C#,Floating Point,如果我取一个浮点值的较低31位(指数和尾数)并逐个循环,则产生的浮点值按升序从0,到float.MaxValue,然后是float.PositiveInfinity,然后是float.NaN的许多不同位模式 对于decimal数据类型,这个漂亮的属性似乎不适用。是否有一种方法可以以类似的方式以升序循环所有可表示的十进制值(在下限和上限之间) 奖励:有没有快速的方法来计算可能的数字 附加信息:可以将1.0和1.00计算为两个不同的数字。十进制格式包含符号位s、96位有效位f和0到28之间的指数e(
浮点值的较低31位(指数和尾数)并逐个循环,则产生的浮点值按升序从0
,到float.MaxValue
,然后是float.PositiveInfinity
,然后是float.NaN
的许多不同位模式
对于decimal
数据类型,这个漂亮的属性似乎不适用。是否有一种方法可以以类似的方式以升序循环所有可表示的十进制值(在下限和上限之间)
奖励:有没有快速的方法来计算可能的数字
附加信息:可以将1.0和1.00计算为两个不同的数字。十进制格式包含符号位s、96位有效位f和0到28之间的指数e(包括)。(s,f,e)的表示值为(−1) s•f/10e
定义(s,f,e)的标准表示为(s,f•10n,e+n),对于其中f•10n<296和e的最大整数n≤ 28如果e不是28,则规范有效位位于上限(296/10),296−1,包括在内
我们可以通过以下方式按升序迭代非负<代码>十进制<代码>值:
Set s = 0, e = 28.
For f from 0 to 2^96 - 1, inclusive:
Process (s, f, e) as a decimal value.
For e from 27 down to 0, inclusive:
For f from ceiling(2^96 / 10) to 2^96 - 1, inclusive:
Process (s, f, e) as a decimal value.
负数的扩展是显而易见的。你读过Jon的答案了吗?也许它能给我们一些启示。就我所知,这可能是不可能的,因为同一个数字有多个表示。@AlexandruClonțea:当然可以遍历所有可表示的值。人们会跳过非规范表示(对于任何想要的规范赋值)。@EricPostphil啊。。。。说得好。也许该睡觉了。大脑迟钝。我不能这么晚才编辑我的评论,我仍然认为那篇文章可能是错误的useful@AlexandruClonțea:我读过这篇文章,我知道decimal
数据类型在内存中的外观。我仍然没有找到一个好的方法来枚举或计算两个给定小数(最小值和最大值)之间的可表示小数。感谢您的时间,我将对其进行测试,但是第一次“仔细考虑”看起来非常有希望!如果可能,将进行多次投票:)
(0) Set s to 0, f to fL, and e to eL.
(1) If e ≤ eU and f > fU, stop.
(2) Process (s, f, e) as a decimal number.
(3) Set f to f+1.
(4) If f is less than 2^96, go to (1).
(5) Set e to e-1 and f to f/10.
(6) Go to (1).