Rust: Tambahkan dukungan untuk literal float heksadesimal

Dibuat pada 5 Jan 2012  ·  17Komentar  ·  Sumber: rust-lang/rust

Kita harus dapat mengurai output dari %a printf untuk dukungan yang tepat dari konstanta matematika tanpa kehilangan presisi
(yaitu sintaks 0x1.ffffffffffffffp+1023_f64)

A-frontend E-easy

Komentar yang paling membantu

Float heksadesimal cukup populer di antara perpustakaan matematika C. Dan saya juga ingin menggunakannya di Rust.

Saya melihat bahwa float heksadesimal telah diimplementasikan di rust sebagai ekstensi, kemudian dipindahkan ke peti terpisah dan sekarang berada di rust-deprecated dan gagal dikompilasi dengan karat malam.

Bagaimana masa depan fitur ini?

Semua 17 komentar

Saya telah bermain dengan masalah ini dan menyimpulkan bahwa sayangnya ini menghidupkan kembali masalah #1306. Lexer saat ini melarang karakter alfa apa pun setelah . karena itu. Kita dapat memilih mengizinkan mereka secara selektif ketika pola 0x<digits>. ditemukan, tetapi tampaknya terlalu tidak konsisten dan mungkin memerlukan pandangan ke depan yang tak terbatas jika kita ingin menghilangkan inkonsistensi.

Saya sarankan membutuhkan angka atau 0x atau 0b setelah titik. Ini menghindari tabrakan dan (anehnya) memungkinkan Anda mengganti radix mid-literal jika Anda mau. Dan itu hanya sedikit lebih buruk dari apa yang dibuat C99 untuk Anda tulis.

@graydon Atau kita hanya bisa meminta nol setelah titik. (misalnya 0x1fffffffffffff.0p+972_f64 bukannya 0x1.fffffffffffffp+1023_f64 )

Saya tidak percaya ini tidak kompatibel, mencalonkan kembali.

diterima untuk pencapaian fitur lengkap

dikunjungi untuk triase yang berasal dari 2013-07-15. Sudahkah kita benar-benar menetapkan sintaks di sini? Sepertinya ini mungkin tugas mudah yang bagus untuk kontributor baru _if_ kita dapat memberikan mereka spesifikasi sintaks yang jelas; tetapi jika sintaks masih dalam tahap desain, maka klaim itu kurang benar.

Saya pikir kita belum cukup memahami sintaksnya tetapi saya harus menunjukkan bahwa itu perlu untuk menghindari bertabrakan dengan sufiks (beberapa di antaranya dimulai dengan f, digit hex), jadi saya pikir jika kita melakukan ini, itu hanya akan berfungsi untuk menentukan mantissa, dan hanya jika digabungkan dengan eksponen penuh (dalam desimal).

Ini masih harus dilaksanakan.

Bukan 1.0

Float heksadesimal cukup populer di antara perpustakaan matematika C. Dan saya juga ingin menggunakannya di Rust.

Saya melihat bahwa float heksadesimal telah diimplementasikan di rust sebagai ekstensi, kemudian dipindahkan ke peti terpisah dan sekarang berada di rust-deprecated dan gagal dikompilasi dengan karat malam.

Bagaimana masa depan fitur ini?

Juga tertarik dengan ini. Saya ingin menerapkan sistem fisika yang dapat diputar ulang untuk sebuah game, yang membutuhkan hasil yang konsisten di seluruh komputer. Hex float literal akan memungkinkan saya untuk menulis nilai floating-point bit-exact dalam tes dan konstanta.

Paling tidak, pernyataan mengapa fitur ini tidak digunakan lagi akan dihargai, karena utas ini adalah hasil pertama yang saya dapatkan untuk "rust hex float literal".

Situasinya agak canggung saat ini. Makro prosedural sedang mengalami perombakan sekarang (#38356), jadi setidaknya akan membuang-buang waktu untuk terus memperbarui hexfloat saat ini terjadi. Tapi saya tidak tahu bagaimana ceritanya setelah itu.

Jika pemahaman saya benar, float heksadesimal di C/C++ ada karena float desimal tidak dijamin untuk dibulatkan dengan benar [1]. Namun, di Rust, setelah #27307 --- saya menduga ini belum tentu disengaja! --- hampir semua float desimal (#31407 menjelaskan kasus tepi yang praktis tidak relevan) harus dibulatkan ke yang terdekat, jadi Anda bisa memberikan rustc nomor yang sesuai (katakanlah, 30) dari angka pecahan dan akan mendapatkan angka yang dibulatkan dengan benar. Ini akan menjadi jawaban "praktis" untuk saat ini.

Satu hal yang menurut saya masih relevan dengan float heksadesimal adalah konversi dari C/C++. Anda tidak ingin mengonversi semua pelampung heksadesimal ke desimal sendiri :) Saya baru-baru ini menulis makro prosedural eksperimental yang melakukan hal ini, mengubah pelampung heksadesimal menjadi pelampung desimal (yang dapat dipahami oleh rustc), tetapi enggan merilisnya karena status quo sebenarnya tidak dijamin sejauh ini --- itu murni keberuntungan menurut saya. Jika ada cara untuk membuat float dengan pola bit yang tepat hanya dari constexprs, saya akan mengadaptasinya.

[1] Misalnya, ISO C99 hanya mensyaratkan bahwa pelampung desimal harus dikonversi ke angka yang dapat diwakili dalam ±1,5 ulps ("hasilnya adalah nilai perwakilan terdekat, atau nilai perwakilan yang lebih besar atau lebih kecil yang berbatasan langsung dengan nilai perwakilan terdekat" ).

@lifthrasiir , cepat atau lambat saya ingin memperbaiki https://github.com/jameysharp/corrode/issues/73 dengan menerjemahkan C hex floats ke Rust dengan benar, jadi saya ingin memahami komentar Anda dengan lebih baik. Saya belum cukup membaca tentang masalah floating-point untuk memahami apa yang terlibat di sini.

Apakah Anda mengatakan bahwa, bug kompiler modulo Rust, setiap literal hex-float dapat dikonversi menjadi literal float desimal yang akan dikonversi oleh kompiler Rust ke pola bit yang sama? Jika demikian, saya akan senang jika Corrode melakukan konversi itu. Bisakah Anda merekomendasikan referensi yang harus saya baca agar algoritme melakukan konversi itu dengan benar? (Penunjuk ke makro prosedural Anda akan bagus, tetapi idealnya saya juga ingin memiliki makalah atau buku untuk dikutip.)

Yang mengatakan, saya mengumpulkan versi desimal yang tepat dari hex float mungkin membutuhkan lebih banyak digit (kan?), jadi mungkin versi hex-float lebih mudah dibaca dan dipahami, setidaknya untuk orang yang cukup peduli dengan presisi numerik untuk menggunakannya . Jika hex float adalah bentuk yang disukai manusia untuk angka-angka ini, saya berpendapat bahwa Rust harus mendukungnya. Jadi IMO, lebih banyak umpan balik dari orang-orang yang telah menggunakan pelampung hex akan membantu di sini.

Apakah Anda mengatakan bahwa, bug kompiler modulo Rust, setiap literal hex-float dapat dikonversi menjadi literal float desimal yang akan dikonversi oleh kompiler Rust ke pola bit yang sama?

Keyakinan saya adalah ya.

Bisakah Anda merekomendasikan referensi yang harus saya baca agar algoritme melakukan konversi itu dengan benar?

Anda tidak harus mengimplementasikannya, karena kompiler Rust dan pustaka standar saat ini mengimplementasikan semua algoritma yang diperlukan (yang lebih sulit :-). Jika Anda benar-benar membutuhkan referensi, lihat yang berikut:

  • Konversi dari biner ke desimal ("flt2dec", #24612) adalah hibrida dari [Dragon4] dan [Grisu3].

    • [Dragon4]: Burger, RG dan Dybvig, RK 1996. Mencetak angka floating-point dengan cepat dan akurat. SIGPLAN Tidak. 31, 5 (Mei 1996), 108-116.
    • [Grisu3]: Florian Loitsch. 2010. Mencetak bilangan floating-point dengan cepat dan akurat dengan bilangan bulat. SIGPLAN Tidak. 45, 6 (Juni 2010), 233-243.
  • Konversi dari desimal ke biner ("dec2flt", #27307) adalah beberapa algoritma yang dijelaskan oleh [Clinger]. (Namun, saya belum menerapkannya sendiri sehingga pengetahuan saya untuk mereka terbatas.)

    • [Clinger]: William D. Clinger. 1990. Cara membaca angka floating point dengan akurat. SIGPLAN Tidak. 25, 6 (Juni 1990), 92-101.

Sebagai catatan, implementasi saya adalah lifthrasiir/hexf (diterbitkan sekarang, belum di crates.io). Jangan ragu untuk mengambil.

Yang mengatakan, saya mengumpulkan versi desimal yang tepat dari hex float mungkin membutuhkan lebih banyak digit (kan?), [...] Jika hex float adalah bentuk yang disukai manusia untuk angka-angka ini, saya berpendapat bahwa Rust harus mendukungnya . [...]

Tidak persis, misalnya, 0x1.999999999999bp-4 = 0.10000000000000002 . Saya tidak punya pendapat apakah Rust harus mendukung hex float atau tidak.

Saya sekarang secara resmi menerbitkan hexf ke crates.io . @jameysharp , saya pikir Anda mungkin dapat menggunakan hexf-parse untuk pekerjaan Anda? (Sintaks tanpa garis bawah harus identik hampir sama dengan C99 hexadecimal-floating-constant non-terminal tanpa opsional floating-suffix .)

Sunting: Aargh saya melewatkan satu kasus. 0x1p1 seharusnya valid tetapi hexf tidak mengenalinya; mungkin mudah untuk memperhitungkan, meskipun.

Kasus penggunaan serupa untuk saya juga; Saya ingin dapat menghasilkan kode karat dari kompiler, tanpa kehilangan presisi untuk literal float.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat