键入以存储高度精确的小数<1

时间:2019-06-07 06:00:59

标签: c++

我要存储的号码少于一个。例如,数字看起来像这样:

0.002937595900

我需要保持所有级别的精度(比如说最高为12)。将其存储在cpp中最有效的方法是什么?我希望可以使用比使用boost模型/小数类型的东西小的东西。

我还有其他存储方式吗?

我要支持的应用程序是存储时间精度最高为微秒,其中数字1表示“ 1天”,使用Google看起来一天中有8.64e + 10微秒,所以1 / 8.64e + 10精度。

3 个答案:

答案 0 :(得分:3)

这取决于您需要哪种精度。如果您需要确保数字保持在所需值的1/2 ^ 52左右,那么double是最好的选择。如果您需要一个精确的数字精度(以十进制表示),那么您提到的提升级别可能是最好的选择。

鉴于您的应用程序,我会将值存储在::std::uint32_t中,并在需要时将其除以86400000.0(也就是一天中的微秒数),就像以前一样在谈论。当然,使用::std::uint32_t最多只能存储大约45天的时间。因此,如果它变得更大,并且仍然需要所有微秒的精度,请将其存储为::std::uint64_t

本质上,您会将数字视为分母为隐式86400000的分数的分子。

答案 1 :(得分:3)

最简单的方法是将微秒数存储在uint64_t中。这样一来,您可以存储超过2亿天,因此可以满足您的需求,而且没有舍入错误。

另一种解决方案是只使用std::chrono::microseconds(内部可能只是int64_t),然后再转换为其他持续时间单位。要返回浮点数打印,您可以执行以下操作:

#include <iostream>
#include <string>
#include <chrono>

int main()
{
  using namespace std::literals::chrono_literals;
  typedef std::chrono::duration< double, std::ratio<86400> > float_days;
  auto time = 12345678us;
  std::cout << std::chrono::duration_cast< float_days >( time ).count() << " days\n";
}

答案 2 :(得分:0)

正如其他地方所说,这取决于。如果您需要高于double的精度但仍然是固定的精度,则可以使用自定义浮点类型实现。如果您需要无限的精度,则可以采用其他方式来存储此数字。例如,使用两个大整数将其表示为普通分数。