如何在C中创建自己的楼层功能?

如何在C中创建自己的楼层功能?,c,C,我正在创建一个程序,它将从用户那里获取日期、月份和年份,然后以三种不同的格式显示,一种是日历格式,一种是顺序格式,另一种是ISO工作日编号。为了计算第几天,我提供的伪代码声明我需要使用floor函数来计算它。但是,我需要创建自己的,不能使用C库中的标准。很明显,这个节目的内容不止这些,但我被困在这一部分 我不知道从哪里开始,我也不确定我是否把它过度复杂化了。我看了一下floor函数的作用,了解到只要它等于或小于原始值,它就会将某个值返回到最接近的整数。我想用三个参数来创建它,因为这是算法中需要的

我正在创建一个程序,它将从用户那里获取日期、月份和年份,然后以三种不同的格式显示,一种是日历格式,一种是顺序格式,另一种是ISO工作日编号。为了计算第几天,我提供的伪代码声明我需要使用floor函数来计算它。但是,我需要创建自己的,不能使用C库中的标准。很明显,这个节目的内容不止这些,但我被困在这一部分

我不知道从哪里开始,我也不确定我是否把它过度复杂化了。我看了一下floor函数的作用,了解到只要它等于或小于原始值,它就会将某个值返回到最接近的整数。我想用三个参数来创建它,因为这是算法中需要的数量,然后可能使用舍入到最接近的整数,但如果floor的答案大于原始值,则插入一个条件以向下舍入

我的伪代码如下所示:

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,这就是为什么其中一些可能与其他人使用的不同。

最简单的解决方案可能是让C来做。Per:

当实浮点类型的有限值转换为除_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;
}

一种方法是转换-

float myFloor(float value) {
  return (float) (int) value;
}
但你不能用这种方式解决它。编写自己的实现的最佳方法是从平台上的C标准库中窃取实现。但请注意,这可能包含特定于平台的细微差别,因此可能无法移植

C标准库楼层函数通常很聪明,因为它不能通过转换为整型来工作。如果是这样的话,您将面临有符号整数溢出的风险,其行为尚未定义。注意,int的最小可能范围是-32767到+32767

精确的实现还取决于平台上使用的浮点方案

对于使用IEEE754浮点和long-long类型的平台,您可以采用以下方案:

如果数字的大小大于2的53次方, 返回它,因为它已经是完整的。 否则,强制转换为64位 键入long long,然后将其返回。
为此使用浮点运算是有问题的,因为浮点运算将结果舍入为可表示的值,舍入可能会导致30.6*month-91.4分别产生略小于31或184的值,即月份为4和9。那么myfloor30.6*月-91.4将是不希望的值30或183,而不是期望的31或184

无需使用浮点运算,因为整数运算就足够了:

ordinal_day = (306 * month - 914 + 10000) / 10 - 1000 + day;

306*月-914/10在数学上相当于30.6*月-91.4,除了整数除法截断结果,有效地向零方向舍入为整数,而不是向负无穷方向舍入为整数。因为我们需要下限,所以加10000以确保商为正,然后在除法后减去1000以进行补偿。如果月份可能是−30或更低,需要进一步调整,因为商可能是负数。

您的问题是关于编写一个floor函数,但给出的代码并不反映您创建此类函数的尝试。最简单的方法可能是float myFloorfloat value{return float int value;}…@usr2564301我不确定该方法是否能涵盖floor所做的所有事情,因为我已经看过了一些People实现该方法的示例,它们看起来相当复杂,而且,我也不完全确定如何将其从文字转换为代码。另外,如果month=1,你会期望什么;{…}如果是第2个月;{…}要做什么?指定-ansi相当于指定-std=c89或-std=c90,它们的意思相同。这两种方式都不意味着您必须以K&R风格编写代码。我的很多代码都是在这个标准下编译的,但是没有一个包含K&R风格的函数定义。是的,我也有使用C99或C11特性的代码。您应该考虑使用GCC——ANSI-PANANTIC-WORK-WOLT-WORK-WEDS原型- WRADE原型- WORD样式声明- WORD样式定义…和其他选项,如您所见。您的编译器可能不接受-Wold-*选项中的一个或两个。我更愿意使用此选项,但我的课程说明我需要创建自己的选项:/What,确切地说,它说了什么?我猜你就是不能使用floor函数……注意:这只对正值有效。如果为负值,则这不是楼层功能。它也被限制在这个范围内
对于月的有效输入,这两个都不是问题。它说我需要编写自己的楼层函数,而不是使用标准C库中的楼层函数。是的,所有的值都是正数和整数,所以这应该没有问题。标准C库中的一个是floor。