c++ - ejemplos - ¿Cuál es el doble más cercano a 1.0, que no es 1.0?
float c++ definicion (4)
Desde C ++ 11, puede usar
nextafter
para obtener el siguiente valor representable en una dirección dada:
std::nextafter(1., 0.); // 0.99999999999999989
std::nextafter(1., 2.); // 1.0000000000000002
¿Hay alguna manera de obtener mediante programación el doble más cercano a 1.0, pero en realidad no es 1.0?
Una manera hacky de hacer esto sería memcpy el doble a un entero del mismo tamaño, y luego restar uno. De la forma en que funcionan los formatos de punto flotante IEEE754, esto terminaría disminuyendo el exponente en uno mientras cambia la parte fraccional de todos los ceros (1.000000000000) a todos (1.111111111111). Sin embargo, existen máquinas donde los enteros se almacenan little-endian mientras que el punto flotante se almacena big-endian, por lo que eso no siempre funcionará.
En C ++ también puedes usar esto
1 + std::numeric_limits<double>::epsilon()
En C y C ++, lo siguiente da el valor más cercano a 1.0:
#include <limits.h>
double closest_to_1 = 1.0 - DBL_EPSILON/FLT_RADIX;
Sin embargo, tenga en cuenta que en versiones posteriores de C ++, los
limits.h
están en desuso a favor de los
climits
.
Pero, de todos modos, si está utilizando un código específico de C ++, puede usar
#include <limits>
typedef std::numeric_limits<double> lim_dbl;
double closest_to_1 = 1.0 - lim_dbl::epsilon()/lim_dbl::radix;
Y como Jarod42 escribe en su respuesta, desde C99 o C ++ 11 también puede usar
nextafter
:
#include <math.h>
double closest_to_1 = nextafter(1.0, 0.0);
Por supuesto, en C ++ puede (y para versiones posteriores de C ++ debería) incluir
cmath
y usar
std::nextafter
en
std::nextafter
lugar.
En C, puedes usar esto:
#include <float.h>
...
double value = 1.0+DBL_EPSILON;
DBL_EPSILON
es la diferencia entre 1 y el valor mínimo mayor que 1 que es representable.
Deberá imprimirlo en varios dígitos para ver el valor real.
En mi plataforma,
printf("%.16lf",1.0+DBL_EPSILON)
da
1.0000000000000002
.