# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001 Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR , YEAR.
#
# Translators:
# python-doc bot, 2025
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Python 3.14\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-25 14:44+0000\n"
"PO-Revision-Date: 2025-09-16 00:02+0000\n"
"Last-Translator: python-doc bot, 2025\n"
"Language-Team: Indonesian (https://app.transifex.com/python-doc/teams/5390/"
"id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Floating-Point Arithmetic: Issues and Limitations"
msgstr ""
msgid ""
"Floating-point numbers are represented in computer hardware as base 2 "
"(binary) fractions. For example, the **decimal** fraction ``0.625`` has "
"value 6/10 + 2/100 + 5/1000, and in the same way the **binary** fraction "
"``0.101`` has value 1/2 + 0/4 + 1/8. These two fractions have identical "
"values, the only real difference being that the first is written in base 10 "
"fractional notation, and the second in base 2."
msgstr ""
msgid ""
"Unfortunately, most decimal fractions cannot be represented exactly as "
"binary fractions. A consequence is that, in general, the decimal floating-"
"point numbers you enter are only approximated by the binary floating-point "
"numbers actually stored in the machine."
msgstr ""
"Sayangnya, sebagian besar pecahan desimal tidak dapat direpresentasikan "
"persis dengan pecahan biner. Konsekuensinya adalah bahwa, secara umum, angka "
"pecahan *floating-point* desimal yang Anda masukkan hanya didekati oleh "
"angka-angka pecahan *floating-point* biner yang sebenarnya disimpan dalam "
"mesin."
msgid ""
"The problem is easier to understand at first in base 10. Consider the "
"fraction 1/3. You can approximate that as a base 10 fraction::"
msgstr ""
"Masalahnya lebih mudah dipahami pada awalnya di basis 10. Pertimbangkan "
"fraksi 1/3. Anda dapat memperkirakannya sebagai pecahan basis 10::"
msgid "0.3"
msgstr ""
msgid "or, better, ::"
msgstr "atau, lebih baik, ::"
msgid "0.33"
msgstr ""
msgid "0.333"
msgstr ""
msgid ""
"and so on. No matter how many digits you're willing to write down, the "
"result will never be exactly 1/3, but will be an increasingly better "
"approximation of 1/3."
msgstr ""
"dan seterusnya. Tidak peduli berapa banyak digit yang Anda ingin tulis, "
"hasilnya tidak akan pernah benar-benar 1/3, tetapi akan menjadi perkiraan "
"yang semakin baik dari 1/3."
msgid ""
"In the same way, no matter how many base 2 digits you're willing to use, the "
"decimal value 0.1 cannot be represented exactly as a base 2 fraction. In "
"base 2, 1/10 is the infinitely repeating fraction ::"
msgstr ""
"Dengan cara yang sama, tidak peduli berapa banyak digit basis 2 yang ingin "
"Anda gunakan, nilai desimal 0.1 tidak dapat direpresentasikan persis sebagai "
"fraksi basis 2. Dalam basis 2, 1/10 adalah percahan berulang yang tak "
"terhingga ::"
msgid "0.0001100110011001100110011001100110011001100110011..."
msgstr ""
msgid ""
"Stop at any finite number of bits, and you get an approximation. On most "
"machines today, floats are approximated using a binary fraction with the "
"numerator using the first 53 bits starting with the most significant bit and "
"with the denominator as a power of two. In the case of 1/10, the binary "
"fraction is ``3602879701896397 / 2 ** 55`` which is close to but not exactly "
"equal to the true value of 1/10."
msgstr ""
"Berhenti pada jumlah bit yang terbatas, dan Anda mendapatkan perkiraan. Pada "
"kebanyakan mesin saat ini, *float* diperkirakan menggunakan percahan biner "
"dengan pembilang menggunakan 53 bit pertama dimulai dengan bit paling "
"signifikan dan dengan penyebut sebagai pangkat dua. Dalam kasus 1/10, fraksi "
"biner adalah ``3602879701896397 / 2 ** 55`` yang dekat dengan tetapi tidak "
"persis sama dengan nilai sebenarnya dari 1/10."
msgid ""
"Many users are not aware of the approximation because of the way values are "
"displayed. Python only prints a decimal approximation to the true decimal "
"value of the binary approximation stored by the machine. On most machines, "
"if Python were to print the true decimal value of the binary approximation "
"stored for 0.1, it would have to display::"
msgstr ""
msgid ""
">>> 0.1\n"
"0.1000000000000000055511151231257827021181583404541015625"
msgstr ""
msgid ""
"That is more digits than most people find useful, so Python keeps the number "
"of digits manageable by displaying a rounded value instead:"
msgstr ""
msgid ""
">>> 1 / 10\n"
"0.1"
msgstr ""
msgid ""
"Just remember, even though the printed result looks like the exact value of "
"1/10, the actual stored value is the nearest representable binary fraction."
msgstr ""
"Hanya ingat, meskipun hasil cetakannya terlihat seperti nilai tepat 1/10, "
"nilai sebenarnya yang disimpan adalah pecahan biner terdekat yang dapat "
"direpresentasikan."
msgid ""
"Interestingly, there are many different decimal numbers that share the same "
"nearest approximate binary fraction. For example, the numbers ``0.1`` and "
"``0.10000000000000001`` and "
"``0.1000000000000000055511151231257827021181583404541015625`` are all "
"approximated by ``3602879701896397 / 2 ** 55``. Since all of these decimal "
"values share the same approximation, any one of them could be displayed "
"while still preserving the invariant ``eval(repr(x)) == x``."
msgstr ""
"Menariknya, ada banyak angka desimal berbeda yang memiliki pecahan biner "
"perkiraan terdekat yang sama. Misalnya, angka ``0.1`` dan "
"``0.10000000000000001`` dan "
"``0.1000000000000000055511151231257827021181583404541015625`` semuanya "
"didekati oleh ``3602879701896397 / 2 ** 55``. Karena semua nilai desimal ini "
"memiliki perkiraan yang sama, salah satu dari nilai tersebut dapat "
"ditampilkan sambil tetap mempertahankan invarian lainnya ``eval(repr(x)) == "
"x``."
msgid ""
"Historically, the Python prompt and built-in :func:`repr` function would "
"choose the one with 17 significant digits, ``0.10000000000000001``. "
"Starting with Python 3.1, Python (on most systems) is now able to choose the "
"shortest of these and simply display ``0.1``."
msgstr ""
"Secara historis, Python prompt dan fungsi bawaan :func:`repr` akan memilih "
"satu dengan 17 digit signifikan, ``0.10000000000000001``. Dimulai dengan "
"Python 3.1, Python (pada kebanyakan sistem) sekarang dapat memilih yang "
"paling pendek dan hanya menampilkan ``0.1``."
msgid ""
"Note that this is in the very nature of binary floating point: this is not a "
"bug in Python, and it is not a bug in your code either. You'll see the same "
"kind of thing in all languages that support your hardware's floating-point "
"arithmetic (although some languages may not *display* the difference by "
"default, or in all output modes)."
msgstr ""
msgid ""
"For more pleasant output, you may wish to use string formatting to produce a "
"limited number of significant digits:"
msgstr ""
msgid ""
">>> format(math.pi, '.12g') # give 12 significant digits\n"
"'3.14159265359'\n"
"\n"
">>> format(math.pi, '.2f') # give 2 digits after the point\n"
"'3.14'\n"
"\n"
">>> repr(math.pi)\n"
"'3.141592653589793'"
msgstr ""
msgid ""
"It's important to realize that this is, in a real sense, an illusion: you're "
"simply rounding the *display* of the true machine value."
msgstr ""
"Sangat penting untuk menyadari bahwa ini adalah, dalam arti sebenarnya, "
"sebuah ilusi: Anda hanya membulatkan *display* dari nilai mesin yang "
"sebenarnya."
msgid ""
"One illusion may beget another. For example, since 0.1 is not exactly 1/10, "
"summing three values of 0.1 may not yield exactly 0.3, either:"
msgstr ""
msgid ""
">>> 0.1 + 0.1 + 0.1 == 0.3\n"
"False"
msgstr ""
msgid ""
"Also, since the 0.1 cannot get any closer to the exact value of 1/10 and 0.3 "
"cannot get any closer to the exact value of 3/10, then pre-rounding with :"
"func:`round` function cannot help:"
msgstr ""
msgid ""
">>> round(0.1, 1) + round(0.1, 1) + round(0.1, 1) == round(0.3, 1)\n"
"False"
msgstr ""
msgid ""
"Though the numbers cannot be made closer to their intended exact values, "
"the :func:`math.isclose` function can be useful for comparing inexact values:"
msgstr ""
msgid ""
">>> math.isclose(0.1 + 0.1 + 0.1, 0.3)\n"
"True"
msgstr ""
msgid ""
"Alternatively, the :func:`round` function can be used to compare rough "
"approximations:"
msgstr ""
msgid ""
">>> round(math.pi, ndigits=2) == round(22 / 7, ndigits=2)\n"
"True"
msgstr ""
msgid ""
"Binary floating-point arithmetic holds many surprises like this. The "
"problem with \"0.1\" is explained in precise detail below, in the "
"\"Representation Error\" section. See `Examples of Floating Point Problems "
"`_ for "
"a pleasant summary of how binary floating point works and the kinds of "
"problems commonly encountered in practice. Also see `The Perils of Floating "
"Point `_ for a more complete "
"account of other common surprises."
msgstr ""
msgid ""
"As that says near the end, \"there are no easy answers.\" Still, don't be "
"unduly wary of floating point! The errors in Python float operations are "
"inherited from the floating-point hardware, and on most machines are on the "
"order of no more than 1 part in 2\\*\\*53 per operation. That's more than "
"adequate for most tasks, but you do need to keep in mind that it's not "
"decimal arithmetic and that every float operation can suffer a new rounding "
"error."
msgstr ""
msgid ""
"While pathological cases do exist, for most casual use of floating-point "
"arithmetic you'll see the result you expect in the end if you simply round "
"the display of your final results to the number of decimal digits you "
"expect. :func:`str` usually suffices, and for finer control see the :meth:"
"`str.format` method's format specifiers in :ref:`formatstrings`."
msgstr ""
"Sementara kasus patologis memang ada, untuk sebagian besar penggunaan "
"aritmatika floating-point yang santai Anda akan melihat hasil yang Anda "
"harapkan pada akhirnya jika Anda hanya membulatkan tampilan hasil akhir Anda "
"ke jumlah angka desimal yang Anda harapkan. :func:`str` biasanya mencukupi, "
"dan untuk kontrol yang lebih baik lihat format :meth:`str.format` penentu "
"format di :ref:`formatstrings`."
msgid ""
"For use cases which require exact decimal representation, try using the :mod:"
"`decimal` module which implements decimal arithmetic suitable for accounting "
"applications and high-precision applications."
msgstr ""
"Untuk kasus penggunaan yang memerlukan representasi desimal yang tepat, coba "
"gunakan modul :mod:`decimal` yang mengimplementasikan aritmatika desimal "
"yang cocok untuk aplikasi akuntansi dan aplikasi presisi tinggi."
msgid ""
"Another form of exact arithmetic is supported by the :mod:`fractions` module "
"which implements arithmetic based on rational numbers (so the numbers like "
"1/3 can be represented exactly)."
msgstr ""
"Bentuk lain dari aritmatika yang tepat didukung oleh modul :mod:`fractions` "
"yang mengimplementasikan aritmatika berdasarkan bilangan rasional (sehingga "
"angka seperti 1/3 dapat direpresentasikan secara tepat)."
msgid ""
"If you are a heavy user of floating-point operations you should take a look "
"at the NumPy package and many other packages for mathematical and "
"statistical operations supplied by the SciPy project. See ."
msgstr ""
msgid ""
"Python provides tools that may help on those rare occasions when you really "
"*do* want to know the exact value of a float. The :meth:`float."
"as_integer_ratio` method expresses the value of a float as a fraction:"
msgstr ""
msgid ""
">>> x = 3.14159\n"
">>> x.as_integer_ratio()\n"
"(3537115888337719, 1125899906842624)"
msgstr ""
msgid ""
"Since the ratio is exact, it can be used to losslessly recreate the original "
"value:"
msgstr ""
msgid ""
">>> x == 3537115888337719 / 1125899906842624\n"
"True"
msgstr ""
msgid ""
"The :meth:`float.hex` method expresses a float in hexadecimal (base 16), "
"again giving the exact value stored by your computer:"
msgstr ""
msgid ""
">>> x.hex()\n"
"'0x1.921f9f01b866ep+1'"
msgstr ""
msgid ""
"This precise hexadecimal representation can be used to reconstruct the float "
"value exactly:"
msgstr ""
msgid ""
">>> x == float.fromhex('0x1.921f9f01b866ep+1')\n"
"True"
msgstr ""
msgid ""
"Since the representation is exact, it is useful for reliably porting values "
"across different versions of Python (platform independence) and exchanging "
"data with other languages that support the same format (such as Java and "
"C99)."
msgstr ""
"Karena representasinya tepat, maka berguna untuk porting nilai secara andal "
"di berbagai versi Python (platform independensi) dan pertukaran data dengan "
"bahasa lain yang mendukung format yang sama (seperti Java dan C99)."
msgid ""
"Another helpful tool is the :func:`sum` function which helps mitigate loss-"
"of-precision during summation. It uses extended precision for intermediate "
"rounding steps as values are added onto a running total. That can make a "
"difference in overall accuracy so that the errors do not accumulate to the "
"point where they affect the final total:"
msgstr ""
msgid ""
">>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0\n"
"False\n"
">>> sum([0.1] * 10) == 1.0\n"
"True"
msgstr ""
msgid ""
"The :func:`math.fsum` goes further and tracks all of the \"lost digits\" as "
"values are added onto a running total so that the result has only a single "
"rounding. This is slower than :func:`sum` but will be more accurate in "
"uncommon cases where large magnitude inputs mostly cancel each other out "
"leaving a final sum near zero:"
msgstr ""
msgid ""
">>> arr = [-0.10430216751806065, -266310978.67179024, 143401161448607.16,\n"
"... -143401161400469.7, 266262841.31058735, -0.003244936839808227]\n"
">>> float(sum(map(Fraction, arr))) # Exact summation with single rounding\n"
"8.042173697819788e-13\n"
">>> math.fsum(arr) # Single rounding\n"
"8.042173697819788e-13\n"
">>> sum(arr) # Multiple roundings in extended "
"precision\n"
"8.042178034628478e-13\n"
">>> total = 0.0\n"
">>> for x in arr:\n"
"... total += x # Multiple roundings in standard "
"precision\n"
"...\n"
">>> total # Straight addition has no correct "
"digits!\n"
"-0.0051575902860057365"
msgstr ""
msgid "Representation Error"
msgstr "Kesalahan Representasi"
msgid ""
"This section explains the \"0.1\" example in detail, and shows how you can "
"perform an exact analysis of cases like this yourself. Basic familiarity "
"with binary floating-point representation is assumed."
msgstr ""
"Bagian ini menjelaskan contoh \"0.1\" secara terperinci, dan menunjukkan "
"bagaimana Anda dapat melakukan analisis yang tepat atas kasus-kasus seperti "
"ini sendiri. Diasumsikan terbiasa secara mendasar dengan representasi "
"pecahan *floating point* biner."
msgid ""
":dfn:`Representation error` refers to the fact that some (most, actually) "
"decimal fractions cannot be represented exactly as binary (base 2) "
"fractions. This is the chief reason why Python (or Perl, C, C++, Java, "
"Fortran, and many others) often won't display the exact decimal number you "
"expect."
msgstr ""
":dfn:`Representation error` mengacu pada fakta bahwa beberapa pecahan "
"desimal (sebagian besar, sebenarnya) tidak dapat direpresentasikan persis "
"sebagai pecahan biner (basis 2). Ini adalah alasan utama mengapa Python "
"(atau Perl, C, C++, Java, Fortran, dan banyak lainnya) sering tidak akan "
"menampilkan angka desimal tepat yang Anda harapkan."
msgid ""
"Why is that? 1/10 is not exactly representable as a binary fraction. Since "
"at least 2000, almost all machines use IEEE 754 binary floating-point "
"arithmetic, and almost all platforms map Python floats to IEEE 754 binary64 "
"\"double precision\" values. IEEE 754 binary64 values contain 53 bits of "
"precision, so on input the computer strives to convert 0.1 to the closest "
"fraction it can of the form *J*/2**\\ *N* where *J* is an integer containing "
"exactly 53 bits. Rewriting ::"
msgstr ""
msgid "1 / 10 ~= J / (2**N)"
msgstr ""
msgid "as ::"
msgstr "sebagai ::"
msgid "J ~= 2**N / 10"
msgstr ""
msgid ""
"and recalling that *J* has exactly 53 bits (is ``>= 2**52`` but ``< "
"2**53``), the best value for *N* is 56:"
msgstr ""
msgid ""
">>> 2**52 <= 2**56 // 10 < 2**53\n"
"True"
msgstr ""
msgid ""
"That is, 56 is the only value for *N* that leaves *J* with exactly 53 bits. "
"The best possible value for *J* is then that quotient rounded:"
msgstr ""
msgid ""
">>> q, r = divmod(2**56, 10)\n"
">>> r\n"
"6"
msgstr ""
msgid ""
"Since the remainder is more than half of 10, the best approximation is "
"obtained by rounding up:"
msgstr ""
msgid ""
">>> q+1\n"
"7205759403792794"
msgstr ""
msgid ""
"Therefore the best possible approximation to 1/10 in IEEE 754 double "
"precision is::"
msgstr ""
msgid "7205759403792794 / 2 ** 56"
msgstr ""
msgid ""
"Dividing both the numerator and denominator by two reduces the fraction to::"
msgstr "Membagi pembilang dan penyebut dengan dua mengurangi pecahan menjadi::"
msgid "3602879701896397 / 2 ** 55"
msgstr ""
msgid ""
"Note that since we rounded up, this is actually a little bit larger than "
"1/10; if we had not rounded up, the quotient would have been a little bit "
"smaller than 1/10. But in no case can it be *exactly* 1/10!"
msgstr ""
"Perhatikan bahwa sejak kami mengumpulkan, ini sebenarnya sedikit lebih besar "
"dari 1/10; jika kita belum mengumpulkan, hasil bagi akan sedikit lebih kecil "
"dari 1/10. Tetapi tidak dapatkah hal itu *exactly* 1/10!"
msgid ""
"So the computer never \"sees\" 1/10: what it sees is the exact fraction "
"given above, the best IEEE 754 double approximation it can get:"
msgstr ""
msgid ""
">>> 0.1 * 2 ** 55\n"
"3602879701896397.0"
msgstr ""
msgid ""
"If we multiply that fraction by 10\\*\\*55, we can see the value out to 55 "
"decimal digits:"
msgstr ""
msgid ""
">>> 3602879701896397 * 10 ** 55 // 2 ** 55\n"
"1000000000000000055511151231257827021181583404541015625"
msgstr ""
msgid ""
"meaning that the exact number stored in the computer is equal to the decimal "
"value 0.1000000000000000055511151231257827021181583404541015625. Instead of "
"displaying the full decimal value, many languages (including older versions "
"of Python), round the result to 17 significant digits:"
msgstr ""
msgid ""
">>> format(0.1, '.17f')\n"
"'0.10000000000000001'"
msgstr ""
msgid ""
"The :mod:`fractions` and :mod:`decimal` modules make these calculations easy:"
msgstr ""
msgid ""
">>> from decimal import Decimal\n"
">>> from fractions import Fraction\n"
"\n"
">>> Fraction.from_float(0.1)\n"
"Fraction(3602879701896397, 36028797018963968)\n"
"\n"
">>> (0.1).as_integer_ratio()\n"
"(3602879701896397, 36028797018963968)\n"
"\n"
">>> Decimal.from_float(0.1)\n"
"Decimal('0.1000000000000000055511151231257827021181583404541015625')\n"
"\n"
">>> format(Decimal.from_float(0.1), '.17')\n"
"'0.10000000000000001'"
msgstr ""