Приведенный ниже код просто преобразует 32-битное целое из объекта, передаваемого функции, 32-разрядное целое представляет собой плавающее число. Я проверил с помощью онлайн-калькулятора, что я получаю знак, экспоненту и мантессу правильным способом, но странно, что я получаю ответ неправильно.IEEE754 с плавающей запятой C#
Может кто-нибудь, пожалуйста, проверьте, математически ли я (или, может быть, программно), что-то неправильно это сделал !?
С уважением
public double FromFloatSafe(object f)
{
uint fb = Convert.ToUInt32(f);
uint sign, exponent = 0, mantessa = 0;
uint bias = 127;
sign = (fb >> 31) & 1;
exponent = (fb >> 23) & 0xFF;
mantessa = (fb & 0x7FFFFF);
double fSign = Math.Pow((-1), sign);
double fMantessa = 1 + (1/mantessa);
double fExponent = Math.Pow(2, (exponent -bias));
double ret = fSign * fMantessa * fExponent;
return ret;
}
'BitConverter.GetBytes (FB)' и затем 'BitConverter.ToSingle()'? –
Использование 'Math.Pow' для fSign немного раздуто :-)' sign == 0? 1: -1'. И это мантисса, а не мантесса. – xanatos
Почему вы передаете число с плавающей запятой в виде целого числа? Что вы на самом деле пытаетесь сделать? C# может обрабатывать отливки просто отлично, почему вы используете неправильные типы данных? – Luaan