Информация об изменениях

Сообщение Re[3]: Java пытается маскировать неточную природу double-ов от 22.02.2022 14:05

Изменено 22.02.2022 14:26 halo

Re[3]: Java пытается маскировать неточную природу double-ов
Здравствуйте, netch80, Вы писали:

N>Кто читерит в C#, я не понял. Вот у меня дотнет 7.0.100-preview.1.22110.4 (из снапа убунты).

Недосмотрел, понадеявшись на единое поведение от версии к версии.
$ mcs mcs --version
Mono C# compiler version 4.6.2.0


Хорошо, допустим, виноват древний Mono. В то же время, быстрая проверка на dotnetfiddle.net при выполнении
private static double a() { return 0.1; }
private static double b() { return 0.2; }
    
public static void Main() {
    Console.WriteLine("{0:F54}", a() + b()); // не заинлайнит (?)
}


показывает следующие результаты:
* .NET 4.7.2: 0.300000000000000000000000000000000000000000000000000000 (аналогично моему примеру вчера)
* .NET 6: 0.300000000000000044408920985006261616945266723632812500

Ваш пример в варианте с .NET 4.7.2 кроме вариций 0.3(0) ничего не показывает. В то же время, Console.WriteLine("{0:X}", BitConverter.DoubleToInt64Bits(0.3)); и Console.WriteLine("{0:X}", BitConverter.DoubleToInt64Bits(0.1 + 0.2)); ведут себя одинаково от версии к версии, и совершенно так же, как в Java для аналогичного кода (0x3FD3333333333333 и 0x3FD3333333333334 соответственно).

N>У него есть режим вывода "самое короткое представление"? Я быстрым гуглением не нашёл.

Понятия не имею. Я пытался найти такое только для JLS, как следствие работы javac, а не как следствие работы Object.toString() как заявлялось в начале темы. Как оно же действительно работает, меня не сильно волнует.
Re[3]: Java пытается маскировать неточную природу double-ов
Здравствуйте, netch80, Вы писали:

N>Кто читерит в C#, я не понял. Вот у меня дотнет 7.0.100-preview.1.22110.4 (из снапа убунты).

Недосмотрел, понадеявшись на единое поведение от версии к версии.
$ mcs --version
Mono C# compiler version 4.6.2.0


Хорошо, допустим, виноват древний Mono. В то же время, быстрая проверка на dotnetfiddle.net при выполнении
private static double a() { return 0.1; }
private static double b() { return 0.2; }
    
public static void Main() {
    Console.WriteLine("{0:F54}", a() + b()); // не заинлайнит (?)
}


показывает следующие результаты:
* .NET 4.7.2: 0.300000000000000000000000000000000000000000000000000000 (аналогично моему примеру вчера)
* .NET 6: 0.300000000000000044408920985006261616945266723632812500

Ваш пример в варианте с .NET 4.7.2 кроме вариций 0.3(0) ничего не показывает. В то же время, Console.WriteLine("{0:X}", BitConverter.DoubleToInt64Bits(0.3)); и Console.WriteLine("{0:X}", BitConverter.DoubleToInt64Bits(0.1 + 0.2)); ведут себя одинаково от версии к версии, и совершенно так же, как в Java для аналогичного кода (0x3FD3333333333333 и 0x3FD3333333333334 соответственно).

N>У него есть режим вывода "самое короткое представление"? Я быстрым гуглением не нашёл.

Понятия не имею. Я пытался найти такое только для JLS, как следствие работы javac, а не как следствие работы Object.toString() как заявлялось в начале темы. Как оно же действительно работает, меня не сильно волнует.