avakar era casi correcto - use modf, pero el detalle estaba apagado.
modf devuelve la parte fraccionaria, por lo que la prueba debería ser que el resultado de modf es 0.0.
modf toma dos argumentos, el segundo de los cuales debe ser un puntero del mismo tipo que el primer argumento. Pasar NULL o 0 causa un error de segmentación en el tiempo de ejecución de g ++. La norma no especifica que pasar 0 es seguro; podría ser que funcione en la máquina de Avakar pero no lo haga.
También podría usar fmod(a,b)
que calcula el a
módulo b
pasando 1.0. Esto también debería dar la parte fraccionaria.
#include<cmath>
#include<iostream>
int main()
{
double d1 = 555;
double d2 = 55.343;
double int_part1;
double int_part2;
using namespace std;
cout << boolalpha;
cout << d1 << " " << modf (d1, &int_part1) << endl;
cout << d1 << " " << (modf (d1, &int_part1) == 0.0) << endl;
cout << d2 << " " << modf (d2, &int_part2) << endl;
cout << d1 << " " << (modf (d2, &int_part2) == 0.0) << endl;
cout << d2 << " " << modf (d2, &int_part2) << endl;
cout << d1 << " " << (modf (d2, &int_part2) == 0.0) << endl;
cout << d1 << " " << fmod (d1, 1.0) << endl;
cout << d1 << " " << (fmod (d1, 1.0) == 0) << endl;
cout << d2 << " " << fmod (d2, 1.0) << endl;
cout << d2 << " " << (fmod (d2, 1.0) == 0) << endl;
cout.flush();
modf (d1, 0); // segfault
}
Hay hacks para hacer que funcione, pero la forma en que un doble representa su valor significa que es muy posiblemente no se almacena un entero como crees que lo haría Puede almacenar 555 como 554.99999998 o algo divertido como ese. No hay forma de saberlo realmente, a menos que tengas los valores fuente originales y lo resuelvas a partir de ahí. float y double son de precisión limitada. –
@ Ape-inago: en realidad, un doble al que * se le asigna * un valor entero en realidad equivaldrá a ese valor. Y sumar, restar y multiplicar por dobles de valor integral también produce un doble valor integral. Sin embargo, una vez que se multiplica por un doble arbitrario o se divide por un doble, todas las apuestas se desactivan. – rlbond
rlbond, suponiendo que el entero en cuestión es suficientemente pequeño. – avakar