0

I'm creating a change counter program for my C++ class. The numbers we are using are in the 10s of trillions and I was wondering if there was an easy way to store that into a floating point type variable then cast that into an integer type. It isn't an integer literal, it's accepted as an input and I expect possible change.

4

3 回答 3

3

不要使用浮点数。将其保留为整数并使用 64 位长整数。使用“long long”或“int64_t”作为存储这些整数的类型。后者可用于#include <stdint.h>

int main()
{
    long long x = 1450000000000LL;
    printf("x == %lld\n", x);
    return 0;
}
于 2013-01-22T06:57:23.067 回答
0

嗯。没有:D

但是,您可以使用矩阵并为需要使用的数学运算编写函数。如果您正在做很多运算或运算非常大的数字,请查看http://gmplib.org/

于 2013-01-22T06:56:43.367 回答
0

如果您使用浮点数学来表示您的更改计数器,您将遇到严重的麻烦。为什么?- 您是准确性问题的受害者,这些问题会导致表示值在 1、10 和 100 等方面不同的问题,依此类推,直至 (IIRC) 10^6 的值。(假设您指的是“万亿”一词的 10^12 版本。如果您想更深入地了解这一点,请参阅 H. Schmidt 的IEEE 754 转换器页面关于此的 Wikipedia 文章)

因此,如果您需要高于几百万的精度(我假设您这样做),如果您使用像浮点这样的野兽,您真的会陷入困境。为了能够计算数字,您确实需要类似于 (来自 GNU 的多精度库。当然,您可以自由地自己实现相同的功能。

在您的情况下,也许一个 64 位整数可以做到这一点。(请注意,对于 C89,long long 并不总是 64 位和非标准的)只需通过执行以下操作自己解析用户输入(未经测试,只是为了说明这个想法):

const char input[] = "14.5"
uint64_t result = 0;
uint64_t multiplier = 1000000000000;
unsigned int i = 0;

/* First convert the integer part of the number of your input value.
   Could also be done by a library function like strtol or something 
   like that */
while ((input[i] != '.')
       && (input[i] != '\0'))
{
    /* shift the current value by 1 decimal magnitude and add the new 10^0 */
    result = (result * 10) + (input[i] - '0'); 
    i++;
}

/* Skip the decimal point */
if (input[i] == '.') 
{
    i++;
}

/* Add the sub trillions */
while (input[i] != '\0') 
{
    /* shift the current value by 1 decimal magnitude and add the new 10^0 */
    result = (result * 10) + (input[i] - '0'); 
    multiplier /= 10;  // as this is just another fraction we have added, 
                       // we reduce the multiplier...
    i++:
}

result = result * multiplier;

当然,有几个异常需要单独处理,例如结果溢出或正确处理非数字字符,但正如我上面提到的,代码只是为了说明这个想法。

PS:如果是有符号整数,你当然也必须处理负号。

于 2013-01-22T08:42:40.560 回答