float zu int, was macht der Code?

08/18/2014 20:58 dowhile#1
Hi,

was ist der Unterschied zwischen diesem Code (value ist vom Typ float):
Code:
int FloatConstNode::intValue(){
	float flt=value;
	int temp;
	_control87( _RC_NEAR|_PC_24|_EM_INVALID|_EM_ZERODIVIDE|_EM_OVERFLOW|_EM_UNDERFLOW|_EM_INEXACT|_EM_DENORMAL,0xfffff );
	_asm{
		fld [flt];
		fistp [temp];
	}
	_control87( _CW_DEFAULT,0xfffff );
	return temp;
}
(von hier: [Only registered and activated users can see links. Click Here To Register...])

und einem einfachen
Code:
return (int) value;
Was macht die Funktion genau / besonderes?
08/19/2014 00:02 snow#2
Die asm-Instruktionen laden flt auf den FPU Stack & speichern das oberste Element des FPU Stacks als Integer in temp.

_control87 setzt, soweit ich das verstanden habe, die Optionen für die FPU-Operationen, _EM_* steht dabei für Exceptions (Exception bei division by zero etc.), _PC_* für die Präzision und _RC_* für die Rundungsoptionen.

Der größte Unterschied dürfte der sein, dass (int)value wohl _RC_CHOP als Option verwendet, während _RC_NEAR auf- bzw. abrundet, je nachdem, ob der Float-Value > oder < .5 ist.

3.6 würde bei der ersten Methode also wohl 4 returnen, bei der zweiten Methode 3.
08/19/2014 12:15 bloodx#3
geht nicht auch einfach
Code:
float Num = 1.325;
float Num_ = 1.525;
int iNum = 0;
int iNum_ = 0;
	iNum  = static_cast<int>(Num + 0.5);
	iNum_ = static_cast<int>(Num_ + 0.5);
also
Code:
int ConvertFloatToInt(float Number)
{
	return static_cast<int>(Number + 0.5);
}
08/19/2014 13:56 Padmak#4
Oder einfach std::ceil/std::floor?

Padmak
08/29/2014 03:32 Hiris#5
Quote:
Originally Posted by bloodx View Post
geht nicht auch einfach
Code:
float Num = 1.325;
float Num_ = 1.525;
int iNum = 0;
int iNum_ = 0;
	iNum  = static_cast<int>(Num + 0.5);
	iNum_ = static_cast<int>(Num_ + 0.5);
also
Code:
int ConvertFloatToInt(float Number)
{
	return static_cast<int>(Number + 0.5);
}
Wenn ich mich nicht täusche wird bei so einem cast immer runtergerundet, war aber schon ein Jahr her, dass ich das das letzte mal gebraucht habe / es von Bedeutung für mich war ~~
08/29/2014 11:09 snow#6
Quote:
Originally Posted by Hiris View Post
Wenn ich mich nicht täusche wird bei so einem cast immer runtergerundet, war aber schon ein Jahr her, dass ich das das letzte mal gebraucht habe / es von Bedeutung für mich war ~~
deshalb hat er auch den Wert + 0.5 gecastet, damit z.B. 0.5 korrekt auf 1 aufgerundet wird, 0.49 aber eine 0 wird.
08/29/2014 15:22 Hiris#7
Quote:
Originally Posted by snow View Post
deshalb hat er auch den Wert + 0.5 gecastet, damit z.B. 0.5 korrekt auf 1 aufgerundet wird, 0.49 aber eine 0 wird.
Ach lol, da hatte ich wohl gestern Abend nen totalen brainlag :bandit:

Ja passt natürlich