Sólo para confirmar lo que escribió Chris Shain, consigo los mismos valores binarios:
// 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));
}
}
salida de ambos: 4604768117848454313
En otras palabras, los valores dobles son exactamente el mismo patrón de bits , y cualquier diferencia que esté viendo (suponiendo que obtenga los mismos resultados) se debe al formato en lugar de una diferencia en el valor. Por cierto, el valor exacto de ese doble es
0.73195874952002271118800535987247712910175323486328125
Ahora vale la pena señalar que las cosas claramente extrañas pueden suceder en aritmética de punto, sobre todo cuando optimizaciones permiten la aritmética de 80 bits en algunas situaciones pero no en otras, etc. flotando
Como dice Henk, si una diferencia en el último bit o two le causa problemas, entonces su diseño está roto.
Su código ni siquiera dar resultados reproducibles en .NET, así olvidarse de él . Relacionado: http://stackoverflow.com/questions/6683059/are-floating-point-numbers-consistent-in-c-can-they-be – CodesInChaos
¿De verdad? ¿El décimo séptimo dígito significante le está dando "suficientes diferencias en otros cálculos"? ¿Puede darnos un ejemplo? –
Si lo compara con calc.exe y wolfram alpha, el 1 es incorrecto de todos modos. Me quedaría con la implementación de Java. –