Poiché il valore della doppia era meno di 2
double=1.99999999999999978
int=1
provare, ma questa volta aggiungere un po 'di precisione
#include <math.h>
#include <stdio.h>
int main(){
int i;
double f=log(2.0)/log(pow(2.0,1.0/2.0));
printf("double=%0.17f\n",f);
printf("int=%d\n",(int) f);
}
fuorviante in quanto l'inferno la prima volta che si verifica esso. Ora, se provi questo
#include <math.h>
#include <stdio.h>
int main(){
int i;
double f=log(2.0)/log(pow(2.0,1.0/2.0));
printf("double=%0.17f\n",f);
printf("int=%d\n",(int) f);
printf("int=%d\n", (int)round(f));
}
Girerà correttamente il valore. Se si guarda nella pagina man (su un Mac, almeno) si vedrà il seguente commento ...
round, lround, llround -- round to integral value, regardless of rounding direction
Che cosa si intende per direzione, è tutto specificato nella IEEE 754. Se si seleziona il pavimento different ways to round to an integer... è menzionato come arrotondamento verso -ve infinity
che in questo caso è stato verso 1
:)
Sembra che la premessa la domanda è falsa, dalle risposte. Il vero "problema" è che printf arrotonda numeri in virgola mobile. – user35702
Si potrebbe anche considerare un caso in cui int ha la stessa dimensione del doppio e si fa qualcosa come 'log ((double) int_64_variable)'. Sono più incline a farlo su un pezzo di carta che a scrivere un programma c per questo. ;) – sjsam
Si noti inoltre che il lancio in 'int' non * non * floor ma piuttosto tronca verso zero. Questo è importante per i valori negativi. – jamesdlin