我正在创建一个程序,它将从用户那里获取日,月和年,然后以三种不同的格式(日历格式,序数格式和ISO工作日编号)显示该程序。为了计算序数日,我提供的伪代码指出我需要使用下限函数来计算它。但是,我需要创建自己的库,并且不能使用C库中的标准库。显然,该程序还有更多功能,但我只能停留在这一特定部分。
我不知道从哪里开始,而且我不确定是否过于复杂。我看了floor函数的作用,并且我知道只要它等于或小于原始值,它就会将某物的值返回到最接近的整数。我正在考虑使用三个参数创建它,因为这是算法中需要使用的参数,然后可能使用四舍五入到最接近的整数,但是如果下限的答案将大于原始值,则插入一个条件以四舍五入。 / p>
我的伪代码如下:
int calculate_ordinal_day(day, month, year)
if month = 1; {
return day;
}
if month = 2; {
return day + 31;
}
ordinal_day = myfloor(30.6 * month - 91.4) + day
{
if isyearleap == 1
return ordinal_Day + 60
}
return ordinal_day + 59
顺便说一句,我的课程希望使用Ansi C / K&R,这就是为什么其中某些可能与其他人所使用的有所不同的原因。
答案 0 :(得分:5)
最简单的解决方案可能是让C来完成。根据{{3}}:
当实数浮点型的有限值转换为_Bool以外的整数类型时,小数部分将被丢弃(即,该值将被截断为零)。
因此,您所需要做的就是将值转换为整数,而不是将其转换回浮点数:
float myFloor(float value) {
return (float) (int) value;
}
如果您需要处理底片,则可以轻松做到:
float myFloor(float value) {
float tmp = (float) (int) value;
return (tmp != value) ? (tmp - 1.0f) : tmp;
}
答案 1 :(得分:1)
一种方法是转换-
float myFloor(float value) {
return (float) (int) value;
}
但是您不能以这种方式解决。编写自己的实现的最佳方法是从平台上的C标准库中窃取实现。但是请注意,这可能包含特定于平台的细微差别,因此可能无法移植。
C标准库底层函数通常很聪明,因为它无法通过转换为整数类型来工作。如果这样做,您将冒有符号整数溢出的风险,其行为是不确定的。 (请注意,一个int的最小范围是-32767到+32767)。
精确的实现还取决于平台上使用的浮点方案。
对于使用IEEE754浮点的平台和长类型,您可以采用以下方案:
答案 2 :(得分:0)
为此使用浮点是有问题的,因为浮点算术舍入得出可表示的值,并且舍入可能导致30.6 * month - 91.4
产生的值稍小于31或184(对于month
为4)和9。那么myfloor(30.6 * month - 91.4)
将是不希望的值30或183,而不是所需的31或184。
由于整数算术就足够了,因此无需使用浮点数:
ordinal_day = (306 * month - 914 + 10000) / 10 - 1000 + day;
(306 * month - 914) / 10 is mathematically equivalent to
30.6 *月-91.4 except that integer division truncates the result (effectively rounding to an integer in the direction toward zero) instead of taking the floor (rounding to an integer in the direction toward negative infinity). Since we want floor, 10,000 is added to ensure the quotient is positive, and then 1000 is subtract after the division to compensate. (If
月`可能为-30或更小,需要进一步调整,因为商可能为负。)