- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为什么Python可以在float
中表示负零,而不能在int
中表示负零?
进一步来说:
a = 0.0
print(a)
# 0.0
b = -a
print(b)
# -0.0
a = 0
print(a)
# 0
b = -a
print(b)
# 0
int
在那里并没有真正讨论过)。
最佳答案
从历史上看,有一些整数格式可以同时表示-0和+0。符号和幅值以及补码都可以表示−0和+0。事实证明,这些方法没有两个人的补语有用,后者赢得了人们的青睐,并且在今天无处不在。
二进制补码具有一些数值特性,使其在硬件中更易于实现,而具有两个零的值则对程序员造成了麻烦。 (我听说过这样的错误,例如帐户余额为-0而不是+0会导致某人在不应该收到帐单的情况下收到帐单。)
浮点使用符号和大小,因此它既可以表示−0,也可以表示+0。由于浮点数的性质,二进制补码的算术属性不会对浮点数实现有多大帮助,并且具有两个零的值使程序员在某些情况下可以使用一些额外的信息。
因此,整数和浮点格式的选择是由实用程序而非数学上的必要性所驱动的。
看整数算法
让我们考虑使用四个位在计算机硬件中实现一些整数运算。本质上,我们要做的第一件事是实现无符号二进制算术,因此我们设计了一些逻辑门来构成加法器和其他算术单元。因此,加法器的输入0101和0011产生输出1000。
接下来,我们要处理负数。在写作中,我们通过在前面加一个符号来处理负数,因此我们的第一个想法可能是对位进行相同的操作:在前面使用一位表示负数。现在我们有了一个符号和幅度表示。 0001表示+1,而1001表示-1。 0010表示+2,而1010表示-2。 0111代表+7,1111代表-7。并且,当然,0000表示+0,而1000表示-0。这是一个想法,然后我们必须执行它。我们已经有一个加法器,如果将其加到0010(2)和0011(3),它会正确输出0101(5)。但是,如果我们将其送入0011(3)和1001(-1),则输出1100(-4)。因此,我们必须对其进行修改。好吧,还算不错,我们有一个无符号二进制的减法单元,所以我们可以看一下第一位,如果我们要加上一个负数,我们要减去而不是加。这适用于某些操作;对于0011和1001,观察第二个操作数上的前导1并将011和001馈入减法单元,将得出010(2),这是正确的。但是,如果我们有0010和1011,则将010和011馈入减法单元可能会产生一些错误指示(它最初是为无符号二进制设计的),或者可能会“包装”并产生111(因为这样的包装以及“借用”输出”位,使减法单元作为用于减去较宽数字的设计的一部分工作。无论哪种方式,这对于我们的签名号码都是错误的;我们希望0010(2)加1011(−3)的输出为1001(−1)。因此,我们必须设计新的算术单元来处理此问题。也许,当增加数量的混合符号时,他们找出哪个值较大,从较大的值中减去较小的值,然后应用较大的符号位。无论如何,我们仅设计加减单元就要做大量工作。
另一个建议是,使数字为负,将每一位取反。这就是所谓的补语。这很容易理解并且符合否定的概念,只需否定一切即可。让我们考虑一下它如何影响我们的算术单位。对于+3或-3与+2或-2的组合,我们希望得到以下结果:0011(3)+ 0010(2)= 0101(5),0011(3)+ 1101(-2)= 0001( 1),1100(-3)+ 0010(2)= 1110(-1)和1100(-3)+ 1101(-2)= 1010(-5)。经过检查,有一种简单的方法可以使我们的二进制加法器适应这一要求:对所有四个位进行加法,就好像它们是无符号二进制一样;如果前导位有进位,则将其加回到低位。在无符号的无符号二进制0011 + 0010 = 0101中,因此最终输出为0101。带进位的0011 + 1101 = 0000,因此最终结果为0001。1100 + 0010 = 1110(无进位),因此最终结果为1110 1100 + 1101 = 1001(带进位),因此最终结果为1010。
很好我们的补码加法器比符号加法器简单。它不需要比较幅度,也不需要进行减法处理负数。我们可以使其更便宜并获得更多利润。
然后有人想到两个补码的想法。从概念上讲,我们不是从每一位取反,而是从2n中减去数字,其中n是位数。因此10000-0001 = 1111表示-1,1110是-2,1101是-3,依此类推。这对我们的加法器有什么作用?
在无符号二进制中,0010(2)+ 1101(13)= 1111(15)。用两个补数表示,即0010(2)+ 1101(−3)= 1111(−1)。这些位是相同的!这实际上适用于所有两个补码。添加无符号数字的位模式会产生与添加两个补码数字相同的结果。对于无符号二进制和二进制补码,我们可以使用完全相同的逻辑门。那太好了,给那个雇员加薪。这就是现代硬件所做的;相同的算术单位用于加或减两个补码数,而用于加或减无符号数。
这就是为什么两个数字的补码赢得代表负整数的很大一部分原因。这样可以使计算机更简单,更容易,更便宜,更快速,更高效。
(无符号加法和二进制补码加法之间有一个区别:如何检测溢出。在无符号加法中,如果高位进位,则发生溢出。在二进制补码加法中,如果有进位,则发生溢出加法器单元通常通过以一种或另一种形式报告两个指示来处理这一点,如果需要,该信息将在后面的指令中进行测试;它不会影响加法本身)
关于python - 负整数零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458570/
我有一个非常基本的 MySQL 查询,它从数据库表中读取行并将行值添加或减去定义为 $total_balance 的 PHP 字符串。 例如; $statement_details_query = m
我有 following fiddle ,请注意,如果您使输出的宽度变小,图像将被覆盖并且不会出现滚动条 - 完美。 如果我attempt the same effect on the right ,
这个正则表达式将得到 456。我的问题是为什么它不能是 1-234-56 中的 234 ? 56 是否限定 (?!\d)) 模式,因为它不是单个数字。 (?!\d)) 寻找的起始点在哪里? impor
我需要知道两个子结构之间的内存距离 (&my_type.a - &my_tape.b.c) 结果的类型是什么?我需要将它转换为 (signed int),所以显然它是别的东西。 最佳答案 根据 C11
我遇到了一个扩展异常的异常处理程序类,如下所示: public class AppFileReaderException extends Exception { //Explicit seri
如何可视化负 RGB 值? 根据 OpenCV 文档: CV_8S - 8 位有符号整数 (-128..127) 这是否意味着 -128 表示 0 而 127 表示 255? 如果是,那我们为什么需要
我这里有一段代码给我带来了麻烦: idIndex = panoBuffer.indexOf("\"photo_id\":"); System.out.println(idIndex);
我刚刚练习 Java,对此还很陌生。我只是想创建一个随机数生成器程序来跟踪玩家的获胜、失败、获胜百分比和总获胜金额。该程序的逻辑是,玩家每次 session 有 3 次机会,计算机会生成一个随机数,玩
因此,我们被要求创建一个程序,使用户能够从 1-6 个有关矩阵运算的选项中进行选择。在每个用户的输入中,我们需要检查该输入是否适合要完成的操作(程序应该接受整数或 float ,正数或负数)。如果不满
这是我期望的输出 x |x| 1.2 1.2 -2.3 2.3 3.4 3.4 但我一直收到这个: x |x| 1
假设我有这个: $date1=date_create(date('H:I', strtotime('8:00'))); $date2=date_create(date('H:I', strtotime
如何确定负 FixNum 的无符号解释? # unexpected, true (~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2)) #
这是一个用于“邀请您的 friend 加入此群组”脚本的快速 SQL 查询。 我有 2 个表:users 和 group_members。我正在尝试执行一个查询,选择我所有的 friend ——由第一
负 ASCII 值有什么意义? int a = '«'; //a = -85 but as in ASCII table '<<' should be 174 最佳答案 没有负数ASCII值。 ASC
我知道用 PHP 可以做到这一点,但是有没有办法只用 MySQL 来做到这一点? 我有这个数据库: --------------------------------------------------
我在变量中有一个时间戳 $data = (float) -2208988800; 是否可以根据这些数据创建正确的日期?date("d.M.Y", $data) 返回“07.02.2036” 最佳答案
你好我如何将括号格式的负值转换为 double 值。目前我有这个。 Payment.Text = Calc_Payment().ToString("#,##0.00;(#,##0.00)"); 将支付
这是一个小程序。这应该打印 0 或 1,还是它有未定义的行为? #include struct S0 { unsigned f1 : 1; }; struct S0 s; int main (v
运行 lgb.cv 时,我有时会从日志中看到“从分数开始训练”后的负数。想知道这个数字到底是什么意思,单位是什么?是根据参数中指定的指标吗?以下是摘录: [LightGBM] [Info] Total
我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 0 和方差为 1 的正态分布与另一个均值和方差由我的模型预测的正态分布之间的 KL 散度。 我用以下方式定义了损失: def kl_lo
我是一名优秀的程序员,十分优秀!