2.0000000000000004
и 2.
оба представлены как 10.
с одинарной точностью.В вашем случае использование одинарной точности для C # должно дать точный ответ
В другом примере Wolfram Alpha может использовать для расчетов более высокую точность, чем точность станка.Это добавляет большую потерю производительности.Например, в Mathematica при повышении точности вычисления в 300 раз медленнее
k = 1000000;
vec1 = RandomReal[1, k];
vec2 = SetPrecision[vec1, 20];
AbsoluteTiming[vec1^2;]
AbsoluteTiming[vec2^2;]
Это 0,01 секунды против 3 секунд на моем компьютере
Вы можете увидеть разницу в результатах, используя одинарную точностьДвойная точность введена в Java следующим образом:
public class Bits {
public static void main(String[] args) {
double a1=2.0;
float a2=(float)2.0;
double b1=Math.pow(Math.sqrt(a1),2);
float b2=(float)Math.pow(Math.sqrt(a2),2);
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(a1)));
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(a2)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(b1)));
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(b2)));
}
}
Вы можете видеть, что результат с одинарной точностью является точным, тогда как двойная точность отключается на один бит