округление больших чисел с плавающей точкой - PullRequest
0 голосов
/ 03 июня 2019

Я реализую алгоритм Якобиана, чтобы найти собственное значение данной матрицы. Моя проблема с числами с плавающей запятой, такими как 1.2335604410291751e + 216. Я не могу их округлить.

Я попробовал np.around и round функции, но они не работали.

1 Ответ

0 голосов
/ 19 июня 2019

Если вы хотите округлить m числа в стандартной форме (m × bⁿ), вы можете сделать это следующим образом: для m, b и n число, основание ипоказатель степени, соответственно:

import math

def round_(m, d, b = 10):
    n = math.floor(math.log(abs(m), b),)

    return float(round(m * (b ** (d - n))) * (b ** - (d - n)))

Некоторые тестовые выходы:

>>> print(round_(1.23456783456787434567e-22, 1))
1.2299999999999998e-22
>>> round_(-1.23456783456787434567e+159, 7)
-1.2345678e+159
>>> round_(1.23456783456787434567e+50, 6)
1.234568e+50
>>> round_(-0.23456783456787434567e+256, 5)
-2.34568e+255
>>> round_(1.23456783456787434567e+255, 4)
1.2346e+255
>>> round_(0.23456783456787434567e+272, 3)
2.346e+271
>>> round_(1.23456783456787434567e-23, 2)
1.235e-22
>>> round_(-1.23456783456787434567e+251, 1)
-1.2e+251

Могут возникнуть переполнения (см. вывод № 1) .

Протестированоиспользуя Python 3.7.

...