Я сделал это только для ударов (так что, не совсем вопрос, я могу видеть, что даудмодинг уже происходит), но вместо недавно найденной Google неспособности сделать математика правильно (отметьте это! в соответствии с Google 500 000 000 000 002 - 500 000 000 000 001 = 0), я подумал, что попробую следующее в C, чтобы провести небольшую теорию.
int main()
{
char* a = "399999999999999";
char* b = "399999999999998";
float da = atof(a);
float db = atof(b);
printf("%s - %s = %f\n", a, b, da-db);
a = "500000000000002";
b = "500000000000001";
da = atof(a);
db = atof(b);
printf("%s - %s = %f\n", a, b, da-db);
}
Когда вы запускаете эту программу, вы получаете следующее
399999999999999 - 399999999999998 = 0.000000
500000000000002 - 500000000000001 = 0.000000
Казалось бы, Google использует простую 32-битную точность с плавающей точкой (здесь ошибка), если вы переключите float для double в приведенном выше коде, вы исправите проблему! Может ли это быть так?
/ * т.пл. 1015 *