Не могу получить тот же ответ в C и Excel с той же функцией - PullRequest
0 голосов
/ 27 марта 2019

Я использую c для вычисления следующей функции, но не могу получить правильный ответ (в Excel, используя функцию "INT", это правильный ответ, когда в c я использую "floor" для замены.).

функция:

enter image description here

мой код в c:

int ans;
ans = 1721013.5+367*Y-floor((7/4)*(Y+floor((M+9)/12)))+
        D+h/24+floor(275*M/9);

и я получаю неправильный ответ 2459700, когда Y = 2018,M = 3, D = 9, h = 9

Правильный ответ: 2458187

1 Ответ

1 голос
/ 27 марта 2019

для замены всех констант int на double достаточно:

#include <stdio.h>
#include <math.h>

int main()
{
  int Y=2018,M=3,D=9,h=9; /* can be double of course */
  int ans = ceil(1721013.5+367.0*Y-floor((7.0/4.0)*(Y+floor((M+9.0)/12.0)))+
    D+h/24.0+floor(275.0*M/9.0));

  printf("%d\n", ans);
}

Мне нужно было использовать ceil для печати 2458187, иначе я получу 2458186

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra f.c -lm
pi@raspberrypi:/tmp $ ./a.out
2458187

Дополнительное замечание, из исходной проблемы, поскольку выражение может быть уменьшено на константу (ничто не является переменной), вычисление может быть выполнено во время компиляции, а не во время выполнения:

pi@raspberrypi:/tmp $ gcc -O3 f.c
pi@raspberrypi:/tmp $ cat f.s 
    .arch armv6
    ...
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    push    {r4, lr}
    ldr r1, .L3
    ldr r0, .L3+4
    bl  printf
    mov r0, #0
    pop {r4, pc}
.L4:
    .align  2
.L3:
    .word   2458187
    ...

здесь значение было вычислено во время компиляции: .word 2458187

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...