假设我有一个小数,比如 0.21
Windows 计算器能将其转换为二进制吗?
如果我在程序员模式下尝试输入 0.21,它不会对小数点做出反应。就好像我无法在程序员模式下输入小数点一样。当我在程序员模式下选择二进制时,我也无法在程序员模式下输入二进制小数点。“小数点”似乎被禁用了。
我正在使用 Windows 7。我不知道 Windows 10 中是否已启用此功能?
添加
或者更简单的例子,比如 2.5 或 5.125 那么,小数部分可以用二进制表示吗?所以对于 2.5,计算应该显示 010.10 或 1.10*2^3。或者对于 5.125,计算应该显示 0101.001 或 1.01001*2^5 Windows 计算器可以显示吗?
答案1
因此,分数在内存中的表示方式符合浮点数的 IEEE-754 标准。
像十进制 123 这样简单的数字,当存储为浮点数(例如 123.0)时,实际上存储为1.921875 * 2^6 = 1.921875 * 64
将其视为科学计数法,即a * 10^b
,其中 a 必须是 [1, 10)(表示从 1.0 到 10(但不包括 10),例如 9.999...8)
您的号码0.21
存储在内存中,1.6799999475479126 * 2^(-3)
相当于0.20999999344348907470703125
(Windows 计算器在手动计算时显示为0.209999993443489075
)
任何使用此标准的计算器都将以相同的格式存储数字(如果不是,除了不同的字节序之外,它可能有不同的存储浮点数的方式,因此当将值从一个软件/硬件传递到另一个软件/硬件时,必须进行翻译,但这完全是另一个话题)。
现在,回答你的问题,虽然 Windows 计算器以这种形式存储数字,但它并没有被设计为显示内存中的中间/原始值。如果你真的愿意,你可以使用内存查看工具并在你在计算器中输入值时监视它们,但同样,这是一个不同的话题...
查看https://www.h-schmidt.net/FloatConverter/IEEE754.html了解浮点数是如何存储和表示的。
答案2
@Keltari 通常,分数值可以用二进制表示,使用某种“二进制点”(小数点的对应部分)。事实上,这就是计算机中实数/双精度数的表示方式(尽管通常存储的是二进制点位置,而不是“点字符”)。但请记住:并非所有十进制分数都可以用二进制形式表示确切地- 然后必须应用一些舍入,特别是如果只能使用有限的位数(这在现实计算机科学世界中始终是正确的)。
不幸的是,程序员模式下的 Windows 计算器仅对整数值进行操作。实现目标的解决方法如下:
在标准模式下输入要转换的十进制数(可以是小数),例如0.21
乘以 2(键* 2 =:)
重复步骤 2(=单独按键,反复),直到收到整数或非常接近整数的数字(参见下面的注释)。
重要的!记住,您将初始值乘以 2 的次数(在步骤 2 中并重复 3)。
切换到程序员模式并输入步骤 3 后收到的值,四舍五入为整数(不幸的是,切换模式时不会自动完成此操作,至少在 Windows 10 的计算器应用程序中不会)。
显示整数的二进制表示。假设二进制小数点位于最右边(最后一个二进制数字之后)。然后,将其向左移动与步骤 2 和 3 中相乘的位数相同的位置。根据需要添加前导 0。
例子:
- 原始值:
0.21
- 将其乘以 2 十次 - 您将得到
215,04
。假设它足够接近整数值(这是任意决定!),您将得到四舍五入的整数215
- 进入
215
程序员模式显示其二进制表示:11010111
- 将二进制小数点向左移动 10 位,得到:
.0011010111
备注:正如我之前提到的,并非所有十进制小数值都可以表示确切地二进制形式,所以有时你必须决定什么精度(近似值)能满足你的需求。在上面的例子中,我假设将 215,04 四舍五入为 215 是相对较小的“误差”(低于 1/5000),因此 10 位足以表示原始数字。如果我需要更高的精度,我会乘以 2 而不是十次,而是二十次(结果:220200,96
四舍五入为220201
整数),并得到 20 位二进制表示.00110101110000101001
(“误差”低于 1/5000000)。
顺便说一句,通常计算机中用来表示数据的位数是 2 的幂 - 8、16、32、64,有时是 48 等等。在这种情况下,您可以简单地使用计算器中更快的“乘以 2”的方法,如您在下面的评论中所建议的(*(2^n)
)。