Я предполагаю, что вы имеете в виду "целые числа, представимые как int", будут точно представлены как двойные числа. Это верно, когда число цифр мантиссы в двойном больше, чем число цифр в int. Стоит помнить, что при больших значениях экспоненты расстояние между представимыми числами с плавающей запятой может превышать 1, так что не все целые числа точно представимы в плавающей запятой.

у знать первый дубль от 0d и выше, который отклоняется по длине «того же значения» на некоторую дельту, скажем, 1e-8. Я терплю неудачу здесь, хотя Я пытаюсь сделать это в C, хотя я обычно использую управляемые языки, на всякий случай. Пожалуйста помоги.


#include <stdio.h>
#include <limits.h>
#define DELTA 1e-8

int main() {
    double d = 0; // checked, the literal is fine
    long i;
    for (i = 0L; i < LONG_MAX; i++) {
         d=i; // gcc does the cast right, i checked
         if (d-i > DELTA || d-i < -DELTA) {
              printf("%f", d);
              break;
         }
    }
}

Я предполагаю, что проблема заключается в том, что я отбрасываю i на удвоение и, следовательно, d == i, и тогда разница всегда равна 0. Как еще я могу это правильно определить - я бы предпочел забавное приведение C к сравнению строк, что взять навсегда.

ОТВЕТ: именно так, как мы ожидали. 2 ^ 53 + 1 = 9007199254740993 - это первая разница в соответствии со стандартными инструментами C / UNIX / POSIX. Большое спасибо pax за его программу. И я думаю, математика снова побеждает.

Ответы на вопрос(4)

Ваш ответ на вопрос