2017-06-09 12 views
3

Pythonでは、浮動小数点に非常に大きな整数を掛ける方法はありますか?浮動小数点数にPythonの非常に大きな整数を掛ける

例として、私はprint (10**100000) * 1.414 を試してみましたが、それは私を与えた:値(floatとその多数が)何もすることができることを

OverflowError: long int too large to convert to float

注意を。さらに重要なのは、式の正確な値(最も近い整数に丸められた値)が欲しいということです。

解決策をご提供ください。

+3

「さらに重要なのは、表現の正確な価値が求められていました」 - なぜ浮動小数点を使用していますか?浮動小数点演算は、ソースコードの文字「1.414」を浮動小数点数に変換する操作でさえ、ほとんど常に不正確です。 – user2357112

答えて

2

編集2:

import mpmath 

mpmath.mp.dps = 100005 
i = int(mpmath.mpf("1.414") * 10 ** 100000) 

print(str(i)[:10])  # 1414000000 
print(len(str(i)))  # 100001 
print(str(i)[-10:])  # 0000000000 
print(str(i).count("0")) # 99997 

そして@Stefan用:

[OK]を、私はあなたが後にしているものを見

int(mpmath.mpf("1.414") * (10 ** 100000 + 1000)) 

戻り

14140000000000000 ... 000000000001414  # string contains 99993 0s 
+1

しかし、mpmathはPythonのネイティブモジュールではありません! –

+1

浮動小数点数は実際には1.4139999999999999236166559057892300188541412353515625 –

+5

@Sushilなので、結果は間違っています。あなたは決してPythonネイティブモジュールを求めませんでした。 –

2

は、整数比にフロートを変換します

value = 1.414 
large = 10**100000 

a, b = value.as_integer_ratio() 
number, residual = divmod(large * a, b) 
number += residual*2 >= b 
+0

より正確な値を指定していません。私はあなたのコードを10で試しました** 100 –

+0

@SushilVermaあなたは間違っています、** **正確です。 –

+0

@StefanPochmannここを参照してください:[リンク](http://code.geeksforgeeks.org/TB0x1z) –

0

あなたは整数近似を受け入れているので、ここではネイティブのソリューションです:

def getint(x, y, z): 
    z_nu, z_de = z.as_integer_ratio() 
    return ((x**y) * z_nu) // z_de 

使用法:

>>> getint(2, 3, 5.) 
40 

>>> getint(10, 100000, 1.414) 
1413999999999999923616655905789230018854141235351562500000000... # truncated 
+0

は、最も近い整数の代わりに切り捨てられます。 –

+0

はい、実際は重要ではないかもしれません。 –

2

、あなたが探している場合正確なの値です。これは、文字列として1.414にアクセスする必要があることを意味します(そうでなければ、メモリに格納された値も正確ではありません)。

import decimal 

float_string = '1.614' # to show that rounding works 
exponent = 100000 
decimal.getcontext().prec = exponent + 1 

c = 10 ** exponent + 1 
d = decimal.Decimal(float_string) * c 

print d #1614000.....000002 
+0

@Stefan Pochmannを引用して削除されました。*正確ではありません。たとえば、(Decimal(10 ** 100000)+ 1)* Decimal(1.414)で同じ値を取得しますが、そうしないでください。* – Wondercricket

+0

また、値を変更すると、 。フロートを文字列に変換する方法ははっきりしていません。 –

+0

@Wondercricket更新された –

関連する問題