float ejemplos definicion and c++ floating-point floating-accuracy

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

Demo

¿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 .