我使用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);
当Y = 2018,M = 3,D = 9,h = 9时我得到错误的答案2459700
正确答案:2458187
答案 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("%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