Rust: أضف دعمًا للأحرف العائمة السداسية العشرية

تم إنشاؤها على ٥ يناير ٢٠١٢  ·  17تعليقات  ·  مصدر: rust-lang/rust

نحتاج إلى أن نكون قادرين على تحليل ناتج printf٪ a للدعم المناسب للثوابت الرياضية دون فقدان الدقة
(مثل 0x1.fffffffffffffp + 1023_f64 بناء الجملة)

A-frontend E-easy

التعليق الأكثر فائدة

تحظى العوامات السداسية العشرية بشعبية كبيرة بين مكتبات الرياضيات في لغة سي. وأود أن أستخدمها في Rust أيضًا.

أرى أن الطفو السداسي العشري قد تم تنفيذه في الصدأ كامتداد ، ثم انتقل إلى صندوق منفصل وهو الآن عند rust-deprecated وفشل في التجميع مع الصدأ الليلي.

ما هو مستقبل هذه الميزة؟

ال 17 كومينتر

لقد لعبت مع هذه المشكلة وخلصت إلى أن هذا للأسف يؤدي إلى إحياء المشكلة رقم 1306. يحظر lexer الحالي أي حرف ألفا بعد . بسببه. قد نختار السماح لهم بشكل انتقائي عند العثور على النمط 0x<digits>. ، لكنه يبدو غير متسق للغاية وقد يتطلب نظرة غير متناهية إذا أردنا التخلص من عدم الاتساق.

أقترح طلب رقم أو 0x أو 0b بعد النقطة. هذا يتجنب الاصطدام ويتيح لك (الغريب) تبديل الجذر المتوسط ​​إذا اخترت ذلك. وهو أقبح قليلاً مما يجعلك C99 تكتبه.

graydon أو يمكننا طلب الأصفار فقط بعد النقطة. (على سبيل المثال ، 0x1fffffffffffff.0p+972_f64 بدلاً من 0x1.fffffffffffffp+1023_f64 )

لا أعتقد أن هذا غير متوافق مع الوراء ، إعادة الترشيح.

تم قبولها لمرحلة إنجاز الميزات الكاملة

تمت زيارتها لفرز التي يرجع تاريخها إلى 15 يوليو 2013. هل استقرنا بالفعل على بناء جملة هنا؟ يبدو أن هذا قد يكون مهمة سهلة ولطيفة لمساهم جديد _if_ يمكننا أن نمنحه مواصفات واضحة لبناء الجملة ؛ ولكن إذا كانت البنية لا تزال في مرحلة التصميم ، فإن هذا الادعاء أقل صحة.

أعتقد أننا لم نقم بتسمير بناء الجملة تمامًا ولكن يجب أن أشير إلى أنه سيكون من الضروري تجنب الاصطدام باللواحق (بعضها يبدأ بـ f ، وهو رقم سداسي عشري) ، لذلك أعتقد أنه إذا قمنا بهذا ، يجب أن يعمل فقط من أجل تحديد الجزء العشري ، وفقط عندما يقترن بأس كامل (في النظام العشري).

هذا لم يتم تنفيذه بعد.

ليس 1.0

تحظى العوامات السداسية العشرية بشعبية كبيرة بين مكتبات الرياضيات في لغة سي. وأود أن أستخدمها في Rust أيضًا.

أرى أن الطفو السداسي العشري قد تم تنفيذه في الصدأ كامتداد ، ثم انتقل إلى صندوق منفصل وهو الآن عند rust-deprecated وفشل في التجميع مع الصدأ الليلي.

ما هو مستقبل هذه الميزة؟

مهتم أيضًا بهذا. إنني أتطلع إلى تطبيق نظام فيزيائي يمكن إعادة تشغيله للعبة ، الأمر الذي يتطلب نتائج متسقة عبر أجهزة الكمبيوتر. ستسمح لي القيم الحرفية العائمة السداسية بكتابة قيم الفاصلة العائمة بدقة البت في الاختبارات والثوابت.

على الأقل ، سيتم تقدير بيان سبب إهمال هذه الميزة ، لأن هذا الخيط هو أول نتيجة أحصل عليها لـ "rust hex float literal".

الوضع رديء بعض الشيء في الوقت الحالي. تخضع وحدات الماكرو الإجرائية لعملية تجديد في الوقت الحالي (# 38356) ، وبالتالي سيكون على الأقل مضيعة للوقت للحفاظ على hexfloat محدثًا أثناء حدوث ذلك. لكني لا أعرف ماذا ستكون القصة بعد ذلك.

إذا كان فهمي صحيحًا ، فإن العوامات السداسية العشرية في C / C ++ موجودة لأنه لا يمكن ضمان التقريب العشري بشكل صحيح [1]. ومع ذلك ، في Rust ، بعد # 27307 - أظن أن هذا ليس بالضرورة مقصودًا! - يجب تقريب جميع العشري

الشيء الوحيد الذي ما زلت أعتقد أن العوامات السداسية العشرية ذات صلة به هو التحويل من C / C ++. لن ترغب في تحويل جميع العوامات السداسية العشرية إلى عدد عشري بنفسك :) لقد قمت مؤخرًا بكتابة ماكرو إجرائي تجريبي يقوم بهذا بالضبط ، حيث قمت بتحويل العوامات السداسية العشرية إلى أعداد عشرية (يمكن أن يفهمها rustc) ، لكنني كنت مترددًا في إصدار واحد لأن لم يكن الوضع الراهن مضمونًا في الواقع حتى الآن - إنه مجرد حظ في رأيي. إذا كانت هناك طريقة لإنشاء تعويم بنمط بت دقيق فقط من كونتكسبر ، فسوف أقوم بتكييف ذلك.

[1] على سبيل المثال ، تتطلب ISO C99 فقط تحويل العشرية العشرية إلى رقم يمكن تمثيله في حدود ± 1.5 أب ("النتيجة هي إما أقرب قيمة يمكن تمثيلها ، أو قيمة أكبر أو أصغر قابلة للتمثيل بجوار أقرب قيمة يمكن تمثيلها" ).

lifthrasiir ، عاجلاً أم آجلاً ، أرغب في إصلاح https://github.com/jameysharp/corrode/issues/73 بترجمة C hex float إلى Rust بشكل صحيح ، لذلك أرغب في فهم تعليقك بشكل أفضل. لم أقم بقراءة كافية حول قضايا النقطة العائمة لفهم ما ينطوي عليه الأمر هنا حتى الآن.

هل تقول ذلك ، أخطاء مترجم modulo Rust ، كل حرف سداسي عشري يمكن تحويله إلى عدد عشري حرفي سيحوله مترجم Rust إلى نفس نمط البت؟ إذا كان الأمر كذلك ، فسيسعدني أن أجري تآكلًا يقوم بهذا التحويل. هل يمكنك أن تنصحني بمرجع يجب أن أقرأه لخوارزمية لإجراء هذا التحويل بشكل صحيح؟ (سيكون المؤشر إلى الماكرو الإجرائي رائعًا ، لكن من الناحية المثالية ، أود الحصول على ورقة أو كتاب لأستشهد به أيضًا.)

ومع ذلك ، أجمع النسخة العشرية الدقيقة لعوم سداسي عشري قد يستغرق عددًا أكبر بكثير من الأرقام (أليس كذلك؟) ، لذلك ربما يكون الإصدار السداسي العائم أسهل في القراءة والفهم ، على الأقل بالنسبة للأشخاص الذين يهتمون بدرجة كافية بالدقة الرقمية لاستخدامها . إذا كانت العوامات السداسية هي الشكل المفضل لدى الإنسان لهذه الأرقام ، فأنا أزعم أن Rust يجب أن يدعمها. لذا ، IMO ، المزيد من التعليقات من الأشخاص الذين استخدموا العوامات السداسية ستساعد هنا.

هل تقول ذلك ، أخطاء مترجم modulo Rust ، كل حرف سداسي عشري يمكن تحويله إلى عدد عشري حرفي سيحوله مترجم Rust إلى نفس نمط البت؟

إيماني هو نعم.

هل يمكنك أن تنصحني بمرجع يجب أن أقرأه لخوارزمية لإجراء هذا التحويل بشكل صحيح؟

لا يتعين عليك تنفيذ ذلك ، لأن مترجم Rust الحالي والمكتبة القياسية ينفذان جميع الخوارزميات الضرورية (وهي أصعب واحدة :-). إذا كنت حقًا بحاجة إلى مراجع ، فراجع ما يلي:

  • التحويل من النظام الثنائي إلى النظام العشري ("flt2dec" ، # 24612) هو مزيج من [Dragon4] و [Grisu3].

    • [Dragon4]: Burger، RG and Dybvig، RK 1996. طباعة أرقام الفاصلة العائمة بسرعة وبدقة. SIGPLAN لا. 31 ، 5 (مايو 1996) ، 108-116.
    • [Grisu3]: فلوريان لويتش. 2010. طباعة أرقام الفاصلة العائمة بسرعة وبدقة باستخدام الأعداد الصحيحة. SIGPLAN لا. 45 ، 6 (يونيو 2010) ، 233-243.
  • التحويل من النظام العشري إلى الثنائي ("dec2flt" ، # 27307) عبارة عن خوارزميتين تم وصفهما بواسطة [Clinger]. (لم أقم بتطبيقها بنفسي ، لذا فإن معرفتي بها محدودة).

    • [كلينجر]: ويليام د. كلينجر. 1990. كيف تقرأ أرقام الفاصلة العائمة بدقة. SIGPLAN لا. 25 ، 6 (يونيو 1990) ، 92-101.

للتسجيل ، تم تنفيذ عملي هو lifthrasiir / hexf (تم نشره الآن ، ولم يتم نشره بعد في crates.io). لا تتردد في التقاط.

ومع ذلك ، أجمع النسخة العشرية الدقيقة لعوامة سداسية عشرية قد تتطلب أرقامًا أكثر بكثير (أليس كذلك؟) ، [...] إذا كانت العوامات السداسية هي الشكل المفضل لدى الإنسان لهذه الأرقام ، فسأجادل بأن Rust يجب أن يدعمها . [...]

ليس بالضبط ، على سبيل المثال ، 0x1.999999999999bp-4 = 0.10000000000000002 . ليس لدي رأي حول ما إذا كان يجب أن يدعم Rust العوامات السداسية أم لا.

لقد قمت الآن بنشر hexf رسميًا في crates.io . jameysharp ، أعتقد أنه يمكنك على الأرجح استخدام تحليل hexf لعملك؟ (يجب أن تكون البنية بدون الشرطات السفلية متطابقة تقريبًا مع C99 hexadecimal-floating-constant non-terminal sans الاختيارية floating-suffix .)

تحرير: Aargh فاتني حالة واحدة. يجب أن يكون 0x1p1 صالحًا لكن hexf لا يتعرف عليه ؛ ربما يكون من السهل حسابها ، على الرغم من ذلك.

حالة استخدام مماثلة بالنسبة لي أيضًا ؛ أود أن أكون قادرًا على إنشاء كود صدأ من مترجم ، دون فقدان الدقة للحرف العائم.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات