#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