Просто чтобы подтвердить то, что написал Крис Шейн, я получаю те же двоичные значения:
// Java
public class Test
{
public static void main(String[] args)
{
double input = 0.392156862745098;
double pow = Math.pow(input, 1.0/3.0);
System.out.println(Double.doubleToLongBits(pow));
}
}
// C#
using System;
public class Test
{
static void Main()
{
double input = 0.392156862745098;
double pow = Math.Pow(input, 1.0/3.0);
Console.WriteLine(BitConverter.DoubleToInt64Bits(pow));
}
}
Вывод обоих: 4604768117848454313
Другими словами, двойные значения представляют собой точно один и тот же битовый шаблон, и любые различия, которые вы видите (при условии, что вы получите одинаковые результаты), скорее связаны с форматированием чем разница в стоимости. Кстати, точное значение этого двойника равно
0.73195874952002271118800535987247712910175323486328125
Теперь стоит отметить, что в арифметике с плавающей запятой могут происходить явно странные вещи, особенно когда оптимизации допускают 80-битную арифметику в одних ситуациях, но не в других и т. д.
Как говорит Хенк, если разница в последних двух битах вызывает у вас проблемы, значит, ваш дизайн неисправен.
person
Jon Skeet
schedule
12.04.2012