-
-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathfloatingpoint.po
More file actions
544 lines (468 loc) · 19 KB
/
floatingpoint.po
File metadata and controls
544 lines (468 loc) · 19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001 Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 "
"<https://jvns.ca/blog/2023/01/13/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 <http://www.indowsway.com/floatingpoint.htm>`_ 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 <https://scipy."
"org>."
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 ""