如何存储14.5万亿和C浮点类型变量的一些变化

时间:2013-01-22 06:53:44

标签: c floating-point large-data

我正在为我的C ++类创建一个更改计数器程序。我们使用的数字是万亿分之一,我想知道是否有一种简单的方法将其存储到浮点类型变量中,然后将其转换为整数类型。它不是一个整数字面值,它被接受为输入,我希望可能发生变化。

3 个答案:

答案 0 :(得分:3)

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

使用
int main()
{
    long long x = 1450000000000LL;
    printf("x == %lld\n", x);
    return 0;
}

答案 1 :(得分:0)

嗯。不:D

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

答案 2 :(得分:0)

如果您使用浮点数学代表您的更改计数器,您将遇到严重的麻烦。为什么? - 您是准确性问题的受害者,导致代表值在1s,10s和100s之间不同的问题等等,直到(IIRC)10 ^ 6的值。 (假设你指的是'trillion'一词的10 ^ 12版本。如果你想更深入地了解这一点,请参阅H. Schmidt的IEEE 754 Converter pageWikipedia article about this

因此,如果你需要一个高于几百万的精度(我假设你这样做),如果你使用像浮点这样的野兽,你真的会遇到热水。你真的需要像(multiple precision library from GNU这样的东西来计算数字。当然你可以自己实现相同的功能。

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

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;

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

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