【C++】为什么floor函数返回浮点数

(点击上方公众号,可快速关注)

进入话题前先闲扯几句,聊一下今年的就业形势。最近出来两则新闻:

1)一北航22届的朋友,拿跟去年几乎同样的简历找工作,去年收到了拿到了网易、快手、美团、百度、蔚来、B站的Offer,结果今年百度通过简历筛选,蔚来还在评估,快手和网易简历直接挂,阿里直接简历挂(去年是挂在hr面);

2)毕业生企业就业率呈下降趋势,“985”毕业生涌入县城。

感同身受,从20年疫情以来,就业行情逐年恶化。身边想找工作的朋友,普遍反映工作难找,投出的简历石沉大海;我们公司是中型的互联网企业,前两年招人的标准已经卡在硕士学历,好点的学校稍微宽松点,本科生优秀的话也可以进来,今年招聘的标准直接提高到本硕双985,而且HR根本不愁收不到简历;好多人研究生毕业找不到工作干起了外卖。。。各行各业都在艰难地前行。

作为同在艰难前行的人,这是我的一些建议:

  • 什么时候困难好转?疫情是造成这波困境比较重要的方面,按照正常的事物发展的曲线,即使疫情现在完全得到控制,也得需要1~2年左右才能恢复到疫情前的水平。所以大家要做好长期准备,做好风险预案。

  • 努力提升自己,时刻准备着。机会是留给有准备的人的,虽鸡汤但不毒,不卷是不可能的。最近我也在逐步提高阅读量、写作量、学习量,还没怎么着眼睛红了2天,还需要适应,果然年轻好啊。

下面进入正题。

问题背景

在写Haskell程序时,用到了floor函数,用起来非常丝滑,由于觉得理所当然,竟不明所以,遂产生了这个话题。

丝滑的原因:在Haskell里,floor是返回整数的,而在C++里返回浮点数,如果你需要整数类型,需要自己转换。在Haskell里,少了转换所以这个过程顺畅多了。

下面是Haskell里floor函数的类型,接受一个浮点类型,返回整型。

floor :: (RealFrac a, Integral b) => a -> b

下面是C/C++里的floor相关函数的声明,API文档对此的介绍“Computes the largest integer value not greater than arg.”,明明说了返回整数,却返回浮点数,估计很多人有同样的问题。

float       floorf(float arg);
double      floor(double arg);
long double floorl(long double arg);

孰优孰劣,为什么

除了C/C++,其他比较常用的编程语言,如Java、Golang、OCaml、Rust等也采用了同样的策略。之所以这么做主要有两方面考量:

  • floatdouble的范围要远大于int32_tint64_t等整型

    float的范围:-3.4E+38 ~ 3.4E+38

    double的范围:-1.7E-308~1.7E+308

    int32_t的范围:-2,147,483,648(约-2.1E9)到 2,147,483,647(约2.1E9)

    int64_t的范围:-9,223,372,036,854,775,808(约-9.2E18)~ (+9,223,372,036,854,775,807 (约9.2E18)

    int128【不是标准定义,需要编译器扩展】范围也不如float

  • 整型无法表示某些特殊的浮点数

    Haskell中的Integer可以表示任意精度的整数,即使这样,还是无法表示某些浮点数,即FP_INFINITE【无穷】、FP_NAN【Not A Number】。

    再大的整数也无法表示无穷大,再小的整数也无法表示无穷小;本身不是一个数,更不可能用整数表示了。

    而返回浮点数,就可以采用IEEE 754标准表示这些值。

综上,虽然Haskell的处理方式提供了某种便利,但在合理性上不如C/C++的处理方案。

喜欢我的文章,请关注我的公众号。转载请标明出处。

89de508d057aac712d4d86463e9017a4.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值