Не удается получить одинаковый ответ в c и Excel с одинаковой функцией

#c #excel

#c #excel

Вопрос:

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

функция:

введите описание изображения здесь

мой код на 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. 7/4 это целочисленное вычисление, в котором результат будет 1 , а не 1.75 . У вас есть некоторые другие вычисления такого рода. Вы, вероятно, хотите работать с double s, поэтому вместо этого вы бы сделали что-то вроде 7.0/4.0

2. И h / 24 будет равно 0; используйте h / 24.0 , например.

Ответ №1:

достаточно заменить всю константу 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("%dn", 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