Funciones Matemáticas Constexpr


Así que noté en esta página que ninguna de las funciones matemáticas en c++11 parece hacer uso de constexpr, mientras que creo que todas podrían hacerlo. Así que me deja con dos preguntas, una es por qué eligieron no hacer las funciones constexpr. Un dos para una función como sqrt Probablemente podría escribir mi propio constexpr, pero algo como sin o cos sería más complicado, por lo que está allí a su alrededor.

Author: aaronman, 2013-06-27

3 answers

En realidad, debido al antiguo y molesto legado, casi ninguna de las funciones matemáticas puede ser constexpr, ya que todas tienen el efecto secundario de establecer errno en varias condiciones de error, generalmente errores de dominio.

 52
Author: Sebastian Redl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 16:05:48

De " The C++ Programming Language (4th Edition)", por B. Stroustrup, describiendo C++11:

"Para ser evaluada en tiempo de compilación, una función debe ser adecuadamente simple: una función constexpr debe consistir en una sola declaración de retorno; no se permiten bucles ni variables locales. Además, una función constexpr puede no tener efectos secundarios."

Lo que significa que debe estar en línea, sin instrucciones for, while y if y variables locales. Los efectos secundarios también son prohibido (ej: cambio de errno). Otro problema es que la mayoría de las funciones matemáticas son instrucciones FPU que no están representadas en c/c++ puro (están escritas en código ensamblador). Es por eso que la función non of cmath se declara como constexpr.

 9
Author: Adam Szaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 12:09:53

Así que noté en esta página que ninguna de las funciones matemáticas en c++11 parece hacer uso de constexpr, mientras que creo que todos ellos podrían ser. Así que eso me deja con dos preguntas, una es por qué eligieron no hacer que las funciones constexpr.

Esta parte está muy bien contestada por Sebastian Redl y Adam Szaj así que no añadirá nada a ella.

Y dos para una función como sqrt probablemente podría escribir mi propia constexpr, pero algo como pecado o cos sería más complicado así que está allí a su alrededor.

Sí, puede escribir su propia versión de constexpr sin, cos usando las expansiones de la serie taylor de estas funciones. Echa un vistazo a este repositorio de github súper genial que implementa varias funciones matemáticas como funciones constexpr Morwenn / static_math

 4
Author: Lakshay Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 16:49:03