Birim dönüşümlerini boost:: birimlerinde tek duyarlıklı şamandıralarda nasıl tutabilirim?

0

Soru

Float'ı depolama türü olarak kullanan radyan ve dereceler için takma adlarım var.

Bu iki birim arasında dönüşüm yaptığımda, derlemenin değerleri iki katına çıkardığını ve daha sonra dönüşümler yaparken şamandıralara geri döndüğünü görüyorum.

Q: Nasıl alabilirim, emin olun ki tüm işlemler ve dönüşümler kalmak yüzer?

Kodum:

using radians_f = boost::units::quantity<boost::units::si::plane_angle, float>;
using degrees_f = boost::units::quantity<boost::units::degree::plane_angle, float>;

degrees_f to_degrees(const radians_f& angle) { return static_cast<degrees_f>(angle); }
radians_f to_radians(const degrees_f& angle) { return static_cast<radians_f>(angle); }

Derleyici gezgini'nden aşağıdaki derleme yönergelerini görüyorum: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd-Kaynak işlenendeki "convert-from" içindeki tek duyarlıklı kayan nokta değerini hedef işlenendeki çift duyarlıklı kayan nokta değerine dönüştürür.

  • mulsd-İkinci kaynak işlenendeki düşük çift duyarlıklı kayan nokta değerini ilk kaynak işlenendeki düşük çift duyarlıklı kayan nokta değeriyle çarpar.

  • cvtsd2ss-“convert-from” kaynak işlenenindeki çift duyarlıklı kayan nokta değerini tek duyarlıklı kayan nokta değerine dönüştürür

Not: Takma adlarımı veya / veya dönüştürme işlevlerimi yanlış tanımlarsam şaşırmam.

boost boost-units c++ c++14
2021-11-23 10:02:53
1

En iyi cevabı

1

Hacky bir geçici çözüm buldum (Boost Ünitelerinin 57'yi hesaplamasını sağlayarak "üretilebileceğinden" eminim.radyan sabiti başına x derece) dönüşmesini ve dönüşmesini önlemek için double ancak, Boost Ünitelerinin başka bir şaşırtıcı ek yüke neden olduğu gerçeğini gerçekten vurgulamaktadır: bellek yükleri ve kullanırsanız gerekli olmayan depolar float doğrudan veya hatta kendi sarmalayıcınız için float.

Demo sürümü: https://godbolt.org/z/afPE7baxT

Yukarıdakiler, hesaplamaları yüzer olarak kalmaya zorlamanın (rafine edilmemiş) bir yolunu gösterirken, asıl sorunuz "Ek yükü nasıl önleyebilirim" ise, hala nirvana'dan biraz uzaktasınız.

2021-11-23 10:46:36

ne yazık ki, açıları kullanmak, "Ek yükü nasıl önleyebilirim" sorusunda en az tekrarlanabilir örnekti, çünkü sorun ihtiyacım olan diğer birçok birim için de geçerli.
CJCombrink

@CJCombrink: Evet, demek istediğim, yukarıda yaptığım demoya dayanarak (tüm) ek yüklerden kaçınmanın, Destek Ünitelerini atmayı gerektirebileceği gibi görünüyor.
John Zwinck

Sarmalayıcınızda bir yıkıcı veya kopya oluşturucuya sahip olmak bu en uygunsuzluğa neden olabilir.
n. 1.8e9-where's-my-share m.

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................