C # печатает значение с плавающей точкой -0,0 неправильно - PullRequest
0 голосов
/ 03 апреля 2019
Console.WriteLine(" 0.0 float: 0x00000000, {0}", (float)0x00000000);
Console.WriteLine("-0.0 float: 0x80000000, {0}", (float)0x80000000);

C # печатает 0.0 для первого, а вместо -0.0 печатает 2.147484E + 09, что не соответствует ожиданиям. Согласно этому онлайн-конвертеру IEEE-754 формат с плавающей запятой 0x80000000 должен иметь значение -0.0, поскольку формат с плавающей запятой использует формат знака-величины, который поддерживает -0.0.

https://www.h -schmidt.net / FloatConverter / IEEE754.html

Как нам получить C # для печати -0,0 для битовой комбинации UInt32 0x80000000?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Когда вы делаете (float)0x80000000, вы берете целочисленное значение (0x80000000 = 2.147484E + 09) и приводите его к плавающему значению (значение то же самое, но теперь это число с плавающей точкой). Вам нужно взять массив байтов и интерпретировать его как float:

uint l = (uint)0x80000000;
float f = BitConverter.ToSingle(BitConverter.GetBytes(l), 0);
Console.WriteLine("-0.0 float: 0x80000000, {0}", f);

Выход:

-0.0 float: 0x80000000, 0
1 голос
/ 03 апреля 2019

Что мне нужно, так это преобразование шаблона UInt32 0x80000000 в правильное значение -0.0f и печать этого значения как -0.0 - DragonSpit

У меня плохие новости, очевидно, нет способа получить то, что вы хотите:

ПЕТЕР СЕСТОФТ: Некоторая путаница в отношении отрицательного нуля может быть вызвана Тот факт, что текущие реализации C # печатают положительный и отрицательный ноль в так же, как 0.0, и никакая комбинация параметров форматирования, кажется, не влияет этот дисплей. Хотя это, вероятно, сделано из лучших побуждений, это неудачно. Чтобы выявить отрицательный ноль, вы должны прибегнуть к странно выглядящему коду, как этот, который работает, потому что 1 / (- 0.0) = -Infinity <0: </p>

public static string DoubleToString(double d) {
 if (d == 0.0 && 1/d < 0)
 return "-0.0";
 else
 return d.ToString();
} 
...