Pertanyaan Python RuntimeWarning: overflow yang ditemui dalam skalar panjang


Saya baru dalam pemrograman. Dalam proyek Python 2.7 terbaru saya, saya menemukan yang berikut:

RuntimeWarning: overflow yang dijumpai di long_scalars

Bisakah seseorang menjelaskan apa artinya ini dan apa yang bisa saya lakukan untuk memperbaikinya?

Kode berjalan, tetapi saya tidak yakin apakah itu ide yang baik untuk mengabaikan peringatan.

Itu terjadi selama proses tambahan seperti:

SomeList.append(VeryLongFormula)

32
2017-09-26 18:32


asal


Jawaban:


Berikut ini contoh yang mengeluarkan peringatan yang sama:

import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a

hasil

RuntimeWarning: overflow encountered in long_scalars

Pada contoh di atas terjadi karena a adalah dari dtype int32, dan nilai maximim dapat disimpan dalam int32 adalah 2 ** 31-1. Sejak 10**10 > 2**32-1, hasil eksponensial dalam jumlah yang lebih besar dari yang dapat disimpan dalam int32.

Perhatikan bahwa Anda tidak bisa mengandalkan np.seterr(all='warn') untuk menangkap semua luapan kesalahan dalam numpy. Misalnya, pada NumPy 32-bit

>>> np.multiply.reduce(np.arange(21)+1)
-1195114496

sementara di 64-bit NumPy:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848

Keduanya gagal tanpa peringatan, meskipun itu juga karena kesalahan yang meluap. Jawaban yang benar adalah 21 itu! sama

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L

Menurut pengembang numpy, Robert Kern,

Tidak seperti kesalahan floating point yang sebenarnya (di mana perangkat keras FPU menetapkan a   bendera   setiap kali melakukan operasi atom yang melimpah), kita perlu   menerapkan deteksi luapan integer sendiri. Kami melakukannya   itu       skalar, tetapi tidak array karena akan terlalu lambat untuk diterapkan   untuk       setiap operasi atom pada array.

Jadi, beban ada pada Anda untuk memilih yang sesuai dtypes sehingga tidak ada operasi yang meluber.


39
2017-09-26 19:02



Cara mudah untuk mengatasi masalah ini adalah dengan menggunakan Tipe 64 bit

list = numpy.array(list, dtype=numpy.float64)

0
2018-02-12 08:25