для замены всех констант 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