Como manter as conversões de unidades em boost::unidades em precisão simples flutua?

0

Pergunta

Eu tenho aliases para radianos e graus que usar float como o tipo de armazenamento.

Quando eu converter-se entre essas duas unidades de eu ver a montagem de promover os valores de duplicatas e, em seguida, de volta para flutua ao fazer conversões.

Q: Como posso certificar-se de que todas as operações e conversões de estadia em carros alegóricos?

O Meu Código:

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); }

A partir de compilador explorer eu vejo as seguintes instruções de montagem: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Converte um único ponto flutuante de precisão do valor em "converter-de" operando de origem para um casal de ponto flutuante de precisão do valor no operando de destino.

  • mulsd - Multiplica-se a baixa de dupla-precisão de ponto flutuante, o valor do segundo operando de origem, pela baixa precisão dupla valor de ponto flutuante no primeiro operando de origem.

  • cvtsd2ss - Converte uma dupla-precisão de ponto flutuante de valor a "converter-de" operando de origem para um único ponto flutuante de precisão do valor

PS: eu não ficaria surpreso se eu tiver definido minha aliases ou/e o meu funções de conversão incorretamente.

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

Melhor resposta

1

Eu encontrei um hacky solução (que eu tenho certeza que pode ser "productionized", fazendo Aumentar as Unidades de calcular a 57.x graus por radiano constante) para evitar a conversão para e a partir de double, mas o que realmente destaca o fato de que o Impulso Unidades está causando outro surpreendente espécie de sobrecarga: carrega de memória e lojas que não são necessárias se você usar float diretamente, ou até mesmo o seu próprio wrapper para float.

Demonstração: https://godbolt.org/z/afPE7baxT

Assim, enquanto o acima mostra uma (não refinado) para cálculos de força para permanecer como flutuadores, se a sua pergunta real é: "Como posso evitar a sobrecarga" você ainda está um pouco longe de nirvana.

2021-11-23 10:46:36

infelizmente, usando ângulos foram mínimo reproduzível exemplo, na questão do "Como posso evitar a sobrecarga" uma vez que o problema se aplica a muitas outras unidades que eu preciso também.
CJCombrink

@CJCombrink: Sim, o que eu estou dizendo é que parece que evitar (todos) sobrecarga pode exigir afundamento Impulso Unidades, com base na demo eu fiz acima.
John Zwinck

Ter um destruidor ou um construtor de cópia em seu wrapper pode causar este sub-otimização.
n. 1.8e9-where's-my-share m.

Em outros idiomas

Esta página está em outros idiomas

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