class Program
{
static void PrintArray<T>(T[] S)
{
Console.WriteLine(string.Join(", ", S.Select(e => e.ToString())));
}
static void Main(string[] args)
{
//WTF10.Run(args);
//Оптимизация приложений на платформе .NET с использованием языка C# By Саша Голдштейн, Дима Зурбалев, Идо Флатов, стр. 140
//CanCompareBits возвращает истинное значение, если выполняется одно из следующих условий:
//Тип значения содержит только поля простых типов и не переопределяет метод Equals.
//Тип значения содержит только поля типов значений, для которых выполняется условие (1) и не переопределяет метод Equals.
//Тип значения содержит только поля типов значений, для которых выполняется условие (2) и не переопределяет метод Equals.
var a = new Wrapper(0.0f);
var b = new Wrapper(-0.0f);
//Семантически одинаковы, но бинарное представление различно
//Прямое побитовое сравнение дает False
Console.WriteLine(a.Equals(b));
PrintArray(BitConverter.GetBytes(a.Value));
PrintArray(BitConverter.GetBytes(b.Value));
//Семантически одинаковы, но бинарное представление различно
//Decimal - это value type но переопределяет Equals
//Прямого побитового сравнения нет
//True
var c = new Wrapper2(decimal.Parse("1.00", NumberStyles.Any, CultureInfo.InvariantCulture));
var d = new Wrapper2(decimal.Parse("1.0", NumberStyles.Any, CultureInfo.InvariantCulture));
Console.WriteLine(c.Equals(d));
PrintArray(decimal.GetBits(c.Value));
PrintArray(decimal.GetBits(d.Value));
}
}
, на этот раз дуплетом. S>Что не так? На этот раз не перфоманс. Подсказка отдельным постом, чтоб интригу не ломать.
Зачем (накойхер) нужен знаковый нуль в типе для хранения денег и литров? Какой физический смысл у знакового нуля? Правильно, никакого. "Мы вам налили почти ноль литров бензина, а вы нам должны за это почти ноль рублей денег".
Здравствуйте, Слава, Вы писали:
С>Зачем (накойхер) нужен знаковый нуль в типе для хранения денег и литров? Какой физический смысл у знакового нуля? Правильно, никакого. "Мы вам налили почти ноль литров бензина, а вы нам должны за это почти ноль рублей денег".
Видимо, ноги растут из того, что может быть округление до 0, а потом деление на результат. В зависимости от того, с какой стороны округляли, результат будет либо +inf, либо -inf. Но, вообще, выглядит странно, да.
Здравствуйте, Слава, Вы писали:
С>Зачем (накойхер) нужен знаковый нуль в типе для хранения денег и литров?
Мсье знает толк в извращениях
Длинный ответ тут: https://en.wikipedia.org/wiki/Signed_zero . Хинт: чему равен 1/-0?
Короткий — привет из времён, когда компьютеры использовали в первую очередь для общественно полезных вещей типа прогноза погоды или моделирования ядерных взрывов.
Оффтоп: Чтоб не отвечать про "что ж тогда бесполезное?": гугл подсказывает совершенно чудесное:
Ядерные испытания HD1080p Toccata and Fugue in D minor И.C. Бах
от: МЦЯО НИЯУ МИФИ
Здравствуйте, Sinix, Вы писали:
S>Ну и на закуску всё тот же вопрос: какой ещё из стандартных типов лучше не засовывать в структуру без переопределённого GetHashCode()?
double — по той же причине, что и float.
bool — потому что представление implementation defined.
[StructLayout(LayoutKind.Explicit)]
public struct Union
{
[FieldOffset(0)]
public bool ValueBool;
[FieldOffset(0)]
public byte ValueByte;
}
var v = new Union();
for (byte k = 0; k < 5; ++k)
{
v.ValueByte = k;
Console.WriteLine("ValueByte: {0}, ValueBool: {1}", k, v.ValueBool);
}
Здравствуйте, StatujaLeha, Вы писали:
S>>Ну и на закуску всё тот же вопрос: какой ещё из стандартных типов лучше не засовывать в структуру без переопределённого GetHashCode()? SL>double — по той же причине, что и float. SL>bool — потому что представление implementation defined.
Ага. В общем, вопрос из разряда "фиг угадаешь", поэтому не будем показывать пальцем, но это был DateTime: DateTimeKind.Local и DateTimeKind.Unspecified, чтоб их.