第3-9课:浮点数和大数

本文介绍了整数的范围,强调了在算法设计中选择合适数据类型的重要性。讨论了大整数库,如Python、Java的大数支持,以及C/C++的GMP和Miracl等高性能库。接着,文章探讨了浮点数的精度问题,指出双精度浮点数虽范围广泛,但科学计算中精度不足。最后,阐述了浮点数误差的来源,建议避免直接使用浮点数进行相等比较。

整数的范围

“玩”算法,对各种类型的“数”能表达的数据范围要心里有数。

  • 8 位有符号整数能表示的范围是 −128 到 127,无符号时能表示的范围是 0 ~ 255。
  • 16 位的有符号整数能表示的范围是 −32768 到 32767,无符号时能表示的范围是 0 ~ 65535。
  • 32 位的有符号整数能表示的范围是 −2,147,483,648 到 2,147,483,647,无符号时能表示的范围是 0 ~ 4,294,967,295。
  • 64 位的有符号整数能表示的范围是 −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,无符号时能表示的范围是 0 ~ 18,446,744,073,709,551,615。

什么叫心里有数?32 位整数最大能表示大概 42 亿多一点,如果算法要表示某地的人口数,设计数据模型时用 32 位整数也就够了,但是要表示全球人数就不行了。一光年大约 9,460,730,472,580,800 米,从地球到仙女座星系的距离是 254 万光年,已经超出了 64 位整数能表达的范围。我们在设计数据结构的时候,要对问题的规模做到心中有“数”,不要用错数据类型。

大整数库

超过 64 位的超级大数怎么办?如果你要解决的问题需要这么大范围的数,可以考虑使用大整数。Python、Lisp 等语言都内建了大数计算机制,Java 也有 BigInteger 和 BigDecimal 分别用于大整数和大实数的计算。然而,C/C++ 没有内建的机制或类型支持大数计算,但是 C/C++ 有很多高性能的第三方大数库可供选择。

[2025-11-03 19:38:21.762131] | START_US=1762169901688863 | END_US=1762169901762028 | ELAPSED_US=73165 | ELAPSED_MS=73.165 [2025-11-03 19:38:21.762813] | START_US=1762169901762772 | END_US=1762169901762802 | ELAPSED_US=30 | ELAPSED_MS=0.030 [2025-11-03 19:38:21.762915] | START_US=4639129828656676864 | END_US=1762169901762765 | ELAPSED_US=-4637367658754914099 | ELAPSED_MS=0.140 [2025-11-03 19:38:21.763017] | START_US=4642824187726004224 | END_US=1762169901762763 | ELAPSED_US=-4641062017824241461 | ELAPSED_MS=0.245 [2025-11-03 19:38:33.546764] | START_US=1762169913492182 | END_US=1762169913546699 | ELAPSED_US=54517 | ELAPSED_MS=54.517 [2025-11-03 19:38:33.548563] | START_US=1762169913548452 | END_US=1762169913548532 | ELAPSED_US=80 | ELAPSED_MS=0.080 [2025-11-03 19:38:33.548863] | START_US=4645797267167510529 | END_US=1762169913548431 | ELAPSED_US=-4644035097253962098 | ELAPSED_MS=0.403 [2025-11-03 19:38:33.549222] | START_US=4649940226980970497 | END_US=1762169913548429 | ELAPSED_US=-4648178057067422068 | ELAPSED_MS=0.765 [2025-11-03 19:38:59.382396] | START_US=1762169939324800 | END_US=1762169939382329 | ELAPSED_US=57529 | ELAPSED_MS=57.529 [2025-11-03 19:38:59.384192] | START_US=1762169939384079 | END_US=1762169939384161 | ELAPSED_US=82 | ELAPSED_MS=0.082里面的数据都是什么意思,我是这样的gettimeofday(&end, NULL); long long start_us = start.tv_sec * 1000000LL + start.tv_usec; long long end_us = end.tv_sec * 1000000LL + end.tv_usec; long long elapsed_us = end_us - start_us; // 微秒 double elapsed_ms = elapsed_us / 1000.0; // 毫秒具体哪个数据是耗时
最新发布
11-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王晓华-吹泡泡的小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值