在c和excel中使用相同功能无法获得相同答案

时间:2019-03-27 17:53:59

标签: c excel

我使用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);

当Y = 2018,M = 3,D = 9,h = 9时我得到错误的答案2459700

正确答案:2458187

1 个答案:

答案 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