Python의 float가 매우 긴 입력에 대해 ValueError를 발생시키는 이유는 무엇입니까?

FakeName123

x64의 Python 2.7.9에서 다음 동작이 표시됩니다.

>>> float("10"*(2**28))
inf
>>> float("10"*(2**29))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
>>> float("0"*(2**33))
0.0
>>> float("0." + "0"*(2**32))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

더 깊은 근거가없는 한 나는 이것이 최소한의 놀라움을 위반합니다. ValueError가 발생했을 때 "10"*(2**29)매우 긴 문자열에 대한 제한이라고 생각했지만 "0"*(2**33)작동했습니다. 무슨 일이야? 이 동작이 POLA 버그가 아닌 이유를 누구든지 정당화 할 수 있습니까 (아마도 상대적으로 관련없는 버그 인 경우)?

en_Knight

베이스를 추론 할 때 0은 건너 뛰기 때문에

저는 이와 같은 질문에 대해 제가 가장 좋아하는 참조 구현을 찾고 싶습니다.


증거

Casevh는 의견에 큰 직감을 가지고 있습니다. 관련 코드는 다음과 같습니다 .

for (bits_per_char = -1; n; ++bits_per_char)
    n >>= 1;

/* n <- total # of bits needed, while setting p to end-of-string */
while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
    ++p;
*str = p;

/* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
if (n / bits_per_char < p - start) {
    PyErr_SetString(PyExc_ValueError,"long string too large to convert");
    return NULL;

경우 p초기에 문자열로 포인터로 설정됩니다. PyLongDigitValue테이블 을 보면 0이 명시 적으로 0에 매핑되어 있음을 알 수 있습니다.

파이썬은 특정 염기의 변환을 최적화하기 위해 많은 추가 작업을 수행합니다 ( 바이너리 변환에 대한 재미있는 200 줄의 주석이 있습니다 !). 그래서 올바른 염기를 먼저 추론하기 위해 많은 작업을 수행합니다. 이 경우에는 밑수를 추론 할 때 0을 건너 뛸 수 있으므로 오버플로 계산에 포함되지 않습니다.

사실, 우리는이 float를 저장하는 데 필요한 비트 수를 확인하고 있지만, 파이썬은이 계산에서 선행 0을 제거 할만큼 똑똑합니다. 구현 전반에 걸쳐이 동작을 보장하는 float 함수의 문서에는 아무것도 표시되지 않습니다. 그들은 불길하게 말한다

가능한 경우 문자열 또는 숫자를 부동 소수점 숫자로 변환합니다.


이것이 작동하지 않는 경우

당신이 쓸 때

   float("0." + "0"*(2**32))

초기에 기초에 대한 구문 분석을 중지합니다. 나머지 모든 0은 비트 길이 계산에서 고려되며 ValueError


유사한 파싱 트릭

다음 은 공백이 무시 된 float 클래스 의 유사한 경우 입니다 (이 디자인 선택에 대한 작성자의 의도에 대한 흥미로운 의견).

while (Py_ISSPACE(*s))    
    s++;

/* We don't care about overflow or underflow.  If the platform
 * supports them, infinities and signed zeroes (on underflow) are    
 * fine. */

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Typescript가 누락 된 인수에 대해 오류를 발생시키지 않는 이유는 무엇입니까?

분류에서Dev

random.randint ()가 ValueError를 발생시키는 이유는 무엇입니까?

분류에서Dev

int 1 만 [1, 2.3, 'blabla']의 목록 항목 인 경우 Python ''in operator ''가 float 1.0에 대해 'True'를 반환하는 이유는 무엇입니까?

분류에서Dev

NSUnknownKeyException 오류를 발생시키는 필터를 만들 때 CITemperatureAndTint에 대한 매개 변수 키가 나타나는 이유는 무엇입니까?

분류에서Dev

브라우저에서 파일 URL에 많은 슬래시를 입력해도 오류가 발생하지 않는 이유는 무엇입니까?

분류에서Dev

브라우저에서 파일 URL에 많은 슬래시를 입력해도 오류가 발생하지 않는 이유는 무엇입니까?

분류에서Dev

이전 행의 값에 대한 참조가이 Expression.Error를 발생시키는 이유는 무엇입니까?

분류에서Dev

생성자의 null 문자열 매개 변수가 예외를 발생시키지 않는 이유는 무엇입니까?

분류에서Dev

eval () 내의 typeof가 내 함수에서 오류를 발생시키는 이유는 무엇입니까?

분류에서Dev

Java에서 두 개의 중첩 클래스가 예외를 발생시키는 이유는 무엇입니까?

분류에서Dev

바닥재 무한대가 오류를 발생시키지 않는 이유는 무엇입니까?

분류에서Dev

Scanner가 예외를 발생시키는 대신 Scanner # ioException ()을 사용하는 이유는 무엇입니까?

분류에서Dev

Scanner가 예외를 발생시키는 대신 Scanner # ioException ()을 사용하는 이유는 무엇입니까?

분류에서Dev

값을 할당 한 후 긴 숫자를 매개 변수로 주면 오류가 발생하는데 스캐너에서 입력을 받으면 결과가 표시되는 이유는 무엇입니까?

분류에서Dev

내 PlayFramework 앱에서 시간 초과가 매우 긴 이유는 무엇입니까?

분류에서Dev

키가없는 경우 해시 테이블에서 오류를 발생시키는 방법은 무엇입니까?

분류에서Dev

"The Julia Language Documentation"의이 줄이 입력 매개 변수가 다른 유형 인 경우에 대한 외부 생성자를 정의하는 이유는 무엇입니까?

분류에서Dev

C ++ 20의 [[가능성]] 속성이 여기서 경고를 발생시키는 이유는 무엇입니까?

분류에서Dev

UnobservedTaskException 이벤트 핸들러가 예외를 발생시키는 태스크에 대해 트리거되지 않는 이유는 무엇입니까?

분류에서Dev

CakePHP-Model :: save가 UPDATE 대신 INSERT를 발생시키는 이유는 무엇입니까?

분류에서Dev

왜 FLD m80fp는 double 또는 float의 FLD가 SNaN 입력에 대한 예외를 발생시키지 않습니까?

분류에서Dev

PHP의 header () 함수가 오류를 발생시키지 않는 이유는 무엇입니까?

분류에서Dev

===가 정의되지 않은 예외를 발생시키고 ==가 예상대로 작동하는 이유는 무엇입니까?

분류에서Dev

pastespecial 메서드가 때때로 오류 1004를 발생시키고 다른 경우에는 발생하지 않는 이유는 무엇입니까?

분류에서Dev

가장 긴 길이 일치 대신 정규식의 순서에 따라 입력을 일치시키는 방법은 무엇입니까?

분류에서Dev

매우 긴 문자열 키를 사용하는 경우 DICT에서 검색의 시간 복잡도는 무엇입니까?

분류에서Dev

SQLAlchemy CTE 쿼리가 InternalError를 발생시키는 이유는 무엇입니까?

분류에서Dev

lock_guard가 unique_lock에 의해 이미 잠긴 뮤텍스를 얻을 수있는 이유는 무엇입니까?

분류에서Dev

lock_guard가 unique_lock에 의해 이미 잠긴 뮤텍스를 얻을 수있는 이유는 무엇입니까? -여전히 질문

Related 관련 기사

  1. 1

    Typescript가 누락 된 인수에 대해 오류를 발생시키지 않는 이유는 무엇입니까?

  2. 2

    random.randint ()가 ValueError를 발생시키는 이유는 무엇입니까?

  3. 3

    int 1 만 [1, 2.3, 'blabla']의 목록 항목 인 경우 Python ''in operator ''가 float 1.0에 대해 'True'를 반환하는 이유는 무엇입니까?

  4. 4

    NSUnknownKeyException 오류를 발생시키는 필터를 만들 때 CITemperatureAndTint에 대한 매개 변수 키가 나타나는 이유는 무엇입니까?

  5. 5

    브라우저에서 파일 URL에 많은 슬래시를 입력해도 오류가 발생하지 않는 이유는 무엇입니까?

  6. 6

    브라우저에서 파일 URL에 많은 슬래시를 입력해도 오류가 발생하지 않는 이유는 무엇입니까?

  7. 7

    이전 행의 값에 대한 참조가이 Expression.Error를 발생시키는 이유는 무엇입니까?

  8. 8

    생성자의 null 문자열 매개 변수가 예외를 발생시키지 않는 이유는 무엇입니까?

  9. 9

    eval () 내의 typeof가 내 함수에서 오류를 발생시키는 이유는 무엇입니까?

  10. 10

    Java에서 두 개의 중첩 클래스가 예외를 발생시키는 이유는 무엇입니까?

  11. 11

    바닥재 무한대가 오류를 발생시키지 않는 이유는 무엇입니까?

  12. 12

    Scanner가 예외를 발생시키는 대신 Scanner # ioException ()을 사용하는 이유는 무엇입니까?

  13. 13

    Scanner가 예외를 발생시키는 대신 Scanner # ioException ()을 사용하는 이유는 무엇입니까?

  14. 14

    값을 할당 한 후 긴 숫자를 매개 변수로 주면 오류가 발생하는데 스캐너에서 입력을 받으면 결과가 표시되는 이유는 무엇입니까?

  15. 15

    내 PlayFramework 앱에서 시간 초과가 매우 긴 이유는 무엇입니까?

  16. 16

    키가없는 경우 해시 테이블에서 오류를 발생시키는 방법은 무엇입니까?

  17. 17

    "The Julia Language Documentation"의이 줄이 입력 매개 변수가 다른 유형 인 경우에 대한 외부 생성자를 정의하는 이유는 무엇입니까?

  18. 18

    C ++ 20의 [[가능성]] 속성이 여기서 경고를 발생시키는 이유는 무엇입니까?

  19. 19

    UnobservedTaskException 이벤트 핸들러가 예외를 발생시키는 태스크에 대해 트리거되지 않는 이유는 무엇입니까?

  20. 20

    CakePHP-Model :: save가 UPDATE 대신 INSERT를 발생시키는 이유는 무엇입니까?

  21. 21

    왜 FLD m80fp는 double 또는 float의 FLD가 SNaN 입력에 대한 예외를 발생시키지 않습니까?

  22. 22

    PHP의 header () 함수가 오류를 발생시키지 않는 이유는 무엇입니까?

  23. 23

    ===가 정의되지 않은 예외를 발생시키고 ==가 예상대로 작동하는 이유는 무엇입니까?

  24. 24

    pastespecial 메서드가 때때로 오류 1004를 발생시키고 다른 경우에는 발생하지 않는 이유는 무엇입니까?

  25. 25

    가장 긴 길이 일치 대신 정규식의 순서에 따라 입력을 일치시키는 방법은 무엇입니까?

  26. 26

    매우 긴 문자열 키를 사용하는 경우 DICT에서 검색의 시간 복잡도는 무엇입니까?

  27. 27

    SQLAlchemy CTE 쿼리가 InternalError를 발생시키는 이유는 무엇입니까?

  28. 28

    lock_guard가 unique_lock에 의해 이미 잠긴 뮤텍스를 얻을 수있는 이유는 무엇입니까?

  29. 29

    lock_guard가 unique_lock에 의해 이미 잠긴 뮤텍스를 얻을 수있는 이유는 무엇입니까? -여전히 질문

뜨겁다태그

보관