【问题标题】:C 128 bit double typeC 128 位双精度型
【发布时间】:2016-02-08 15:33:48
【问题描述】:

我有以下代码...

            ran_int = rand(); //check READ ME Citation B
            if (input == 32){
                //rand() with 2^31 as lower limit and 2^32 as its upper
                long long int upper_limit = 4294967295;
                long long int lower_limit = 2147483649
                ran_32_64 = (rand() * 2) % (upper_limit - lower_limit);
                ran_32_64 += lower_limit;
            }
            else if(input == 64){
                //rand() x 4 with 2^63 as lower limit and 2^64 as its upper
                unsigned long long int upper_limit = powl(2, 64);
                long long int lower_limit = powl(2, 63); 
                ran_32_64 = (rand() * 4) % (upper_limit - lower_limit); 
                ran_32_64 += lower_limit;

            }
            else if(input == 128){
                //rand() x 8 with 2^127 as lower limit
                unsigned _int128 upper_limit = 
            }

对于最后一个块,我需要表示一个 128 位二进制数。我知道我可以将类型 _int128 用于 128 位值,但这并不完全准确。

所以我想完全准确地说我可以使用双精度类型,但我找不到任何关于 128 位双精度类型的文献。

有什么想法吗?

【问题讨论】:

  • 你应该对浮点数做一些研究。实际上,整数精确的,而浮点不是!而且_int128 无论如何都不是标准类型。
  • C 中数字类型的大小、范围和表示取决于平台;大概您的平台不提供 128 位浮点类型。
  • unsigned long long int upper_limit = powl(2, 64); 的结果不适合 64 位无符号变量。您需要一个 128 位变量来存储它。
  • 如果你试图做 2 的整数幂,你可以使用左移运算符。不过,请确保不要将其右移其类型的宽度或更多。
  • 而不是powl(2, 63),而是使用1LL << 63powl(2, 64) 应该是 __int128(1) << 64

标签: c types binary double 128-bit


【解决方案1】:

编译器支持

如果是 128b,则不是双精度,但 GNU 和 Intel C/C++ 编译器都通过 __float128 支持 128b 浮点数(旧的 Intel C/C++ 编译器有 Quad)。

GCC documentation 非常彻底。

图书馆支持

有库实现包括:

修改后的代码

很难说你的代码试图做什么,但下面是你之前写的 128 位整数等价物。

老实说,我不知道您打算在哪里使用任何宽度的浮点数,因此如果您需要 128b 浮点数的详细信息,请提供更合适的示例。

#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include <quadmath.h>

void foo(int input) {
    int ran_int = rand(); //check READ ME Citation B
    if (input == 32){
        //rand() with 2^31 as lower limit and 2^32 as its upper
        uint32_t upper_limit = 4294967295;
        int32_t  lower_limit = 2147483649;
        uint32_t ran_32_64 = (rand() * 2) % (upper_limit - lower_limit);
        ran_32_64 += lower_limit;
    }
    /*
    else if(input == 64){
        //rand() x 4 with 2^63 as lower limit and 2^64 as its upper
        uint64_t upper_limit = powl(2L, 64);
        int64_t  lower_limit = powl(2L, 63);
        uint64_t ran_32_64 = (rand() * 4) % (upper_limit - lower_limit);
        ran_32_64 += lower_limit;

    }
    */
    else if(input == 128){
        //rand() x 8 with 2^127 as lower limit
        unsigned __int128 upper_limit = powq(2, 64);
        __int128  lower_limit = powq(2, 63);
        unsigned __int128 ran_32_64 = (rand() * 4) % (upper_limit - lower_limit);
        ran_32_64 += lower_limit;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2010-10-19
    • 2016-03-28
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多