Ich würde viel besser fühlen, mit der Verwendung von floor
von math.h
:
f = 4.561
if (f>=0) f=f-floor(f);
else f=f-ceil(f);
// here f = 0.561
aus diesen Gründen:
Wie Sie haben keine Kontrolle über Gießen Integral-Typ (f-long(f)
) zumindest weiß ich nicht, ob es eindeutig als ein Standard definiert ist, der ganzzahligen Teil oder Rundung verwendet. Ganz zu schweigen von der Implementierung von benutzerdefinierten Typen.
Was ist, wenn Ihr Gleitkommawert eine größere Zahl enthält als Ihr Integraltyp? Ich weiß, es gibt nicht so viele Mantissen-Bits für gebrochene Teile für größere Zahlen, aber Sie haben nicht angegeben, welchen schwebenden Datentyp Sie verwenden, wenn 32/64/80/128/256 Bits oder mehr so schwer zu sagen sind und wenn der ganzzahlige Teil ist größer als Ihr integraler Datentyp, der verwendet wird, um den nicht-gebrochenen Teil abzuschneiden, dann wären Sie in Schwierigkeiten mit f-long(f)
.
PS.
Die if-Anweisung konnte vermieden werden, indem das Vorzeichenbit vor und nach der Operation ein- und ausgeblendet wird. Zum Beispiel auf Standard-32-Bit-Float sieht es wie folgt aus:
float f=4.561; // input value
DWORD *dw=(DWORD*)(&f); // pointer to f as integer type to access bits
DWORD m; // sign storage
m=(*dw)&0x80000000; // store sign bit to m
(*dw)&= 0x7FFFFFFF; // f=fabs(f)
f-=floor(f);
(*dw)|=m; // restore original sign from m
// here f = 0.561
Wenn Sie nicht DWORD
jede unsigned 32-Bit-Integer verwenden stattdessen
Sie uns helfen helfen. Welche Sprache verwendest du? –
Entschuldigung. Ich habe automatisch angenommen. Es ist C++. – Nick
Es muss eine schöne Formatierung Weg, aber in einer Prise, wenn n = 4.561 Sie n-trunc (n) –