【问题标题】:most negative value for pythonpython的最大负值
【发布时间】:2019-12-25 02:42:49
【问题描述】:

我预计对 python 最不利的是-maxint-1

我希望有-2,会使整数溢出。

from sys import maxint
maximum_int = maxint
minimum_int = -maxint - 2
#  2147483647
# -2147483649
print maximum_int
print minimum_int

然而。显示正确的结果,并显示比-maxint-1 更负的值。

我可以知道为什么吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    这里可以看到提升为long的结果

    >>> from sys import maxint
    >>> type(-maxint)
    <type 'int'>
    >>> type(-maxint-1)
    <type 'int'>
    >>> type(-maxint-2)
    <type 'long'>
    >>> 
    

    请注意,有符号值的通常约定是负数比正数多一个,因此在这种情况下,-2147483648 仍然是一个 int

    【讨论】:

    • 有趣的是,在我系统上的 python 2.7 中,当您将 maxint 强制为浮点数时,会升级到 long 。似乎转换为浮点数相当于 maxint + 1。在我的系统上:int(float(sys.maxint)) == 9223372036854775808L == sys.maxint + 1 给出True
    • 对于浮点转换o -maxint:int(float(-sys.maxint)) == -9223372036854775808int(float(-sys.maxint)) == -sys.maxint - 1 都是True。因此,在将 maxint 强制为浮点数时要小心!
    • @hobs。这是由于浮点数的精度有限(约 15 个十进制数字)。
    【解决方案2】:

    在 Python 中,ints 将自动提升为 long (bigint)。

    【讨论】:

      【解决方案3】:

      Python 自动提升溢出到 longint 值,该值除了可用内存外没有限制。

      【讨论】:

        【解决方案4】:

        Python 将int 的溢出提升为任意精度的 long,该精度仅受可用内存限制。

        您可以使用此代码查看促销:

        import struct
        from sys import maxint
        maximum_int = maxint
        minimum_int = -maxint-1
        big_minus = -maxint-(maxint*maxint)
        big_plus=maxint*maxint*maxint
        
        def platform():
            return struct.calcsize("P") * 8
        
        def bit_length(x):
            s=bin(x)
            s=s.lstrip('-0b')
            return len(s)
        
        print
        print 'running in   ', platform(), ' bit mode...'   
        print 'maxint:      ', maximum_int, ' bits: ', bit_length(maximum_int)
        print 'minint:      ', minimum_int, ' bits: ',  bit_length(minimum_int)
        print 'a big minus: ', big_minus, ' bits: ', bit_length(big_minus)
        print 'big_plus:    ', big_plus, ' bits: ', bit_length(big_plus)
        print
        

        在 32 位 Python 下运行,返回如下:

        running in    32  bit mode...
        maxint:       2147483647  bits:  31
        minint:       -2147483648  bits:  32
        a big minus:  -4611686016279904256  bits:  62
        big_plus:     9903520300447984150353281023  bits:  93
        

        64位Python下:

        running in    64  bit mode...
        maxint:       9223372036854775807  bits:  63
        minint:       -9223372036854775808  bits:  64
        a big minus:  -85070591730234615856620279821087277056  bits:  126
        big_plus:     784637716923335095224261902710254454442933591094742482943  bits:  189
        

        【讨论】:

          【解决方案5】:

          Python 实现了 biging 概念,类型称为long。大小实际上是无限的。

          【讨论】:

            【解决方案6】:

            如果你真的想要 python 的最负值,float('-inf') 效果很好。

            【讨论】:

              【解决方案7】:

              对于 Python 3,

              import sys
              
              """ max negative number """
              print(sys.maxsize * -1)
              """through python's internal casts from int to long"""
              print(sys.maxsize * -1 + 1)
              
              """
              The sys.maxint constant was removed, since there is no longer a limit to the value of integers. However, sys.maxsize can be used as an integer larger than any practical list or string index. It conforms to the implementation’s “natural” integer size and is typically the same as sys.maxint in previous releases on the same platform (assuming the same build options).
              [1]: https://docs.python.org/3.1/whatsnew/3.0.html#integers
              """
              
              
              

              【讨论】:

                猜你喜欢
                • 2014-10-19
                • 2019-01-09
                • 1970-01-01
                • 1970-01-01
                • 2021-07-18
                • 1970-01-01
                • 1970-01-01
                • 2019-04-14
                • 2020-02-04
                相关资源
                最近更新 更多