我将在嵌入式系统上的 C++ 代码中使用大数字。幸运的是,编译器可以识别长双精度数。
我不能使用标准库、boost库、gnu数学库等。而且系统没有内置float math cpu。
现在如何检测长双溢出?
2 回答
你说你需要“大数字”,但这并不一定意味着使用 long double 。在我所知道的大多数嵌入式应用程序中,选择 long double 是因为它提高了精度,即小数的分辨率比增加的范围要多。
您还声明您的实现几乎没有提供通常的浮点库和/或功能。基于这些陈述,我会质疑您是否需要功能齐全的浮点功能。如果您的问题仅限于“大数字”,请检查您的编译器是否提供long long数据类型,即 64 位整数。
如果您确实需要一些浮点功能,您可以考虑使用定点实现。假设 long long,您可以选择以 48.16 格式表示数字,这将允许 ~2.8x10^14 的数字,小数点右侧有 16 位。(如果您需要介绍定点计算,请从这里开始。)
解决了一些背景问题后,让我们看一下最初的问题。如果您希望检测 unsigned int 中的溢出(我通常在我的嵌入式工作中这样做),将您的最新结果与前一个结果进行比较就足够了。例如,我的应用程序要求我定期检查一个由外部时钟驱动的 16 位计数器。如果我当前的观察小于上次观察,那么我可以假设 16 位计数器溢出,我可以采取相应的措施。如果您使用 long long integer 数据类型实现大数字,则可以应用类似的策略来检测溢出。
由于它不是标准 C++,因此您将不得不依赖特定环境提供的方法。嵌入式系统的制造商应该已经记录了它是如何完成的。问他。