Saat membandingkan pelampung, apa yang Anda sebut ambang perbedaan?


10

Saya membandingkan pelampung di Jawa sekarang dan rumus paling sederhana adalah:

Math.abs(a - b) < THRESHOLD

Saat menamai variabel Anda untuk ambang perbedaan, haruskah Anda menamainya delta atau epsilon ? Secara khusus, yang mana dari dua adalah istilah yang benar untuk nilai terkecil yang dapat mewakili angka floating-point?

Apakah istilah bahasa pemrograman itu spesifik, atau universal di seluruh bahasa?


1
Istilah alternatif: "presisi", "resolusi". Saya suka ini tepatnya;) karena mereka tidak terdengar terlalu teknis.
stakx

1
Di luar topik: Floating-Point Guide merekomendasikan untuk tidak menggunakan jenis perbandingan hampir-kesetaraan ini.
stakx

1
@stakx - istilah yang Anda sarankan salah dan memiliki arti berbeda dari apa yang ditanyakan OP. Pertanyaannya adalah rinci, ya, tapi itu adalah jawab berdasarkan referensi eksternal dan itu memang memiliki relevansi dengan pemrograman ketika berhadapan dengan nilai-nilai floating point. Ini konstruktif dan sesuai topik.

1
@ GlenH7: Saya tidak pernah mengatakan bahwa pertanyaannya tidak bagus, atau tidak dapat dijawab. Bahkan, akulah yang mengangkatnya. Dan karena Anda mengklaim bahwa istilah (memang kurang tepat) yang saya sarankan salah, saya akan tertarik mempelajari mengapa demikian.
stakx

@stakx - permintaan maaf karena menyiratkan Anda telah memilih untuk menutup. Saya bereaksi lebih ke empat suara dekat pada pertanyaan saat ini.

Jawaban:


18

Epsilon dalam matematika dan teknik

Dalam matematika dan teknik secara umum:

  • Delta umumnya digunakan untuk merujuk pada perbedaan, yang bisa dari skala apa pun.
  • Epsilon umumnya digunakan untuk merujuk pada jumlah yang dapat diabaikan.

dan epsilon tampaknya lebih sesuai untuk kasus Anda.


Epsilon dalam ilmu komputer

Dalam ilmu komputer khususnya, istilah epsilon juga mengacu pada mesin espilon yang mengukur perbedaan antara 1.0fdan float terkecil yang benar-benar lebih besar dari 1.0f. Angka terakhir adalah 1.00000011920928955078125funtuk pelampung di Jawa dan dapat dihitung dengan:

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

Definisi epsilon mesin konsisten dengan penggunaan umum epsilon yang dijelaskan di atas.


Membandingkan pelampung

Namun perhatikan bahwa sebelum membandingkan pelampung untuk "kedekatan", Anda harus memiliki gagasan tentang skalanya. Dua pelampung yang sangat besar dan konon sangat berbeda dapat sama:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

Dan sebaliknya, mungkin ada banyak kemungkinan nilai float (dan beberapa urutan besarnya) antara dua float kecil yang berbeda dengan mesin epsilon "hanya". Dalam contoh di bawah ini, ada 10.000.000 nilai float yang tersedia antara smalldan f, tetapi perbedaannya masih jauh di bawah epsilon mesin:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

Artikel yang ditautkan dalam jawaban GlenH7 menyelidiki perbandingan float lebih lanjut dan mengusulkan beberapa solusi untuk mengatasi masalah ini.


2
-1: Dalam perangkat lunak komputasi ilmiah, Epsilon mengacu pada Mesin epsilon atau epsilon Relatif (lihat artikel yang sama). Biasanya, ini bukan jumlah yang sama yang digunakan dalam menerima perkiraan persamaan, karena kesalahan pembulatan adalah kelipatan epsilon mesin atau epsilon relatif, dan biasanya beberapa urutan besaran lebih besar dari itu.
rwong

1
@ rwong Itu adalah salah satu spesialisasi dari istilah epsilon , dan ada banyak lainnya. Dalam rekayasa secara umum, epsilon memang merujuk pada jumlah kecil atau kesalahan dan Mesin epsilon kompatibel dengan gagasan itu.
assylias

@assylias, menggunakan nama yang memiliki definisi standar, dalam konteks di mana definisi standar masuk akal, tetapi untuk sesuatu yang tidak sesuai dengan definisi standar adalah tanda terima untuk masalah.
Pemrogram

@AProgrammer Saya tidak setuju bahwa definisi umum epsilon tidak berlaku untuk komputasi.
assylias

1
@assylias: terima kasih atas klarifikasi. Saya telah menghapus -1 saya.
rwong

16

Dalam matematika, delta digunakan untuk mewakili beberapa perbedaan dari nilai, epsilon digunakan untuk mewakili nilai kesalahan yang berubah-ubah. Dalam hal ini, epsilon akan menjadi nama konvensional.


8

Untuk langsung menjawab pertanyaan Anda, Anda ingin menggunakan istilah itu epsilon. Lebih tepatnya, itu machine epsilontetapi penggunaan umum menjatuhkan "mesin" dan hanya menggunakan epsilon.

Mencari di salinan lokal saya, float.hsaya melihat:

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

Dan komentar yang terkait memperjelas bahwa epsilon adalah istilah yang Anda maksud.

Tetapi kita juga dapat mengandalkan beberapa referensi eksternal lain untuk memverifikasi bahwa itu epsilonadalah istilah yang benar. Lihat di sini , di sini , di sini , dan akhirnya kombinasi dari tag permintaan SO ini . Saya tidak dapat menemukan referensi langsung ke standar IEEE 754 untuk dikutip.


Anda tidak bertanya, tetapi saya menemukan referensi ini yang sangat relevan dengan contoh yang Anda berikan untuk mengklarifikasi pertanyaan Anda.

Lihat artikel blog ini oleh Bruce Dawson dari Valve tentang membandingkan nilai floating point untuk beberapa wawasan mengapa Anda tidak ingin menggunakan perbandingan yang Anda sarankan.

Ada cukup banyak informasi yang dimasukkan ke dalam artikel itu, tetapi ini adalah cuplikan yang paling relevan dari sana:

Jika membandingkan mengapung untuk kesetaraan adalah ide yang buruk, lalu bagaimana memeriksa apakah perbedaannya dalam beberapa batas kesalahan atau nilai epsilon, seperti ini:

bool isEqual = fabs(f1 – f2) <= epsilon;

Dengan perhitungan ini kita dapat mengungkapkan konsep dua pelampung yang cukup dekat sehingga kita ingin menganggapnya sama. Tetapi nilai apa yang harus kita gunakan untuk epsilon?
Mengingat eksperimen kami di atas, kami mungkin tergoda untuk menggunakan kesalahan dalam jumlah kami, yaitu sekitar 1,19e-7f. Bahkan, bahkan ada define di float.h dengan nilai yang tepat, dan itu disebut FLT_EPSILON.
Jelas itu saja. Dewa file header telah berbicara dan FLT_EPSILON adalah epsilon yang benar!
Kecuali bahwa itu adalah sampah. Untuk angka antara 1.0 dan 2.0 FLT_EPSILON mewakili perbedaan antara pelampung yang berdekatan. Untuk angka yang lebih kecil dari 1,0, epsilon dari FLT_EPSILON dengan cepat menjadi terlalu besar, dan dengan angka yang cukup kecil FLT_EPSILON mungkin lebih besar daripada angka yang Anda bandingkan!

Dawson membahas beberapa pertimbangan lain tentang seluk-beluk yang terlibat ketika membandingkan mengapung dan berurusan dengan nilai-nilai yang sangat kecil seperti ini, jadi saya akan mendorong Anda membaca sisa posnya.


Anda mungkin ingin memperjelas bagian pertama dari jawaban Anda: Artikel Bruce sudah menjelaskan mengapa seseorang tidak boleh menggunakan epsilon konstan (seperti yang didefinisikan dalam file header) untuk perbandingan toleransi. Juga, dalam banyak kasus, kesalahan beberapa juta ULP bukanlah sesuatu yang perlu dikhawatirkan, karena dalam sebagian besar aplikasi, kami lebih peduli pada digit signifikan lebih dari kesalahan pada digit paling tidak signifikan, karena presisi ganda sudah memberikan lebih banyak digit daripada yang kita pedulikan.
rwong

@ rwong - ketika saya membacanya, pertanyaannya adalah untuk mengidentifikasi istilah yang tepat untuk digunakan untuk nama konstanta. Jadi itu sebabnya saya memberikan referensi float.h bersama dengan beberapa orang lain ke mesin epsilon. Artikel dari Dawson adalah sesuatu yang saya temukan saat mencari referensi IEEE 754 dan saya pikir relevan dengan OP simplest formulauntuk perbandingan. Banyak yang menggunakan pendekatan itu sebagai upaya pertama, dan saya memasukkan artikel Dawson karena itu benar-benar masuk ke nuansa betapa rumit perbandingan itu. Jadi saya mencoba untuk langsung menjawab pertanyaan dan kemudian menunjukkan mengapa tidak menggunakannya seperti itu.

5

Ini adalah fungsi kesalahan; kesalahan absolut biasanya disebut ε (epsilon) atau Δ x untuk beberapa kuantitas x:

ε = | diharapkan - aktual |

Δ x = | x 0 - x  |

Kesalahan relatif kadang-kadang disebut η (eta):

η = | 1 - aktual / diharapkan |

Untuk tujuan pemrograman, absoluteErrordan relativeError(atau beberapa singkatannya) lebih deskriptif. Jika Anda ingin menegaskan bahwa kesalahan kurang dari nilai tertentu, nilai itu hanya akan disebut ambang batas atau toleransi .

Lihat:


3

Saya akan menyebutnya "toleransi".

Mungkin itu bukan istilah yang benar secara matematis, tetapi fakta bahwa Anda mengajukan pertanyaan menyiratkan kepada saya bahwa "delta" atau "epsilon" tidak akan menjadi nama variabel yang baik untuk digunakan.

Dalam pengalaman saya, lebih baik menggunakan nama pengenal yang masuk akal bagi mereka yang benar-benar akan membaca kode. Apa gunanya nama yang benar-benar benar jika itu berarti bahwa pembaca perlu mencarinya di Wikipedia untuk memahami apa artinya?


+1. Saya selalu berharap orang-orang bertanya kepada rekan kerja mereka tentang pertanyaan-pertanyaan penamaan ini serta memposting di sini.
MarkJ

6
-1, Lebih baik mempelajari konvensi daripada menghindarinya.
djechlin

+1 karena ini adalah alasan yang sama persis dengan yang saya posting pertanyaan ini.
NobleUplift
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.