【问题标题】:How to implement binary128 in C? [closed]如何在 C 中实现 binary128? [关闭]
【发布时间】:2023-03-26 17:34:01
【问题描述】:

我开始尝试使用 C 实现新的数据类型,特别是浮点值。我想出了这种使用 longer_int 实现 binary128 的方法,但我还没有完全理解。

我开始的方式是通过复制代码并修改它来实现它。但是,代码是C++,C不支持OOP,所以我要做的就是尝试翻译代码。

我找不到 longer_int 的 C 版本,因为我曾经拥有的 this question(同一个帐户但现在已删除)现在已被删除,我无法查看链接。

借助这些 C++ 文件,如何使用 C 实现 binary128

为了这个问题不会被关闭,我想知道如何翻译 longer_int.h 中的 OOP 格式。

class longer_int {
private:
    char num_str[];
public:
    longer_int();
    longer_int(const int &num);
    longer_int(const char &num[]);
    longer_int(const longer_int &num);

// Sample code from it, now translated to C, but still OOP

【问题讨论】:

标签: c++ c floating-point 128-bit


【解决方案1】:

您应该从这样的内容开始:struct 而不是 class,忽略 public/private 关键字,构造函数是返回 my_int128 的方法。 C 中没有重载,因此每个不同的构造函数必须具有不同的名称。另一种思想流派会说您不需要专门的构造函数,而只需特殊的方法设置器,它们可以从intchar[]my_int128 复制数据(我更喜欢这种思想流派) .我在最后给出了一个示例设置器。

#include <stdio.h>
#include <string.h>

typedef struct 
{
    char num_str[16]; /* fixed to int128 */
} my_int128;

/* Don't need this: my_int128 li = { 0 }; is enough!
my_int128 create_int128()
{
    my_int128 li = { 0 };
    return li;
}
*/

my_int128 create_int128_from_num(int num)
{
    my_int128 li = { 0 };
    /* TODO: set li with num */
    return li;
}

my_int128 create_int128_from_char_array(const char num[16])
{
    my_int128 li = { 0 };
    memcpy(li.num_str, num, 16);
    return li;
}

my_int128 create_int128_from_int128_ptr(const my_int128 *num)
{
    return create_int128_from_char_array(num->num_str);
}

二传手:

void set_from_int(my_int128 *li, int num)
{
    /* TODO: set li with num */
}

【讨论】:

  • 仍然无法弄清楚如何处理 TO-DO。努力工作的艰难日子。
  • @MarkGiraffe 这取决于你想如何“组织”你的binary128。正是出于这个原因,我写了“TOTO”。有多种方法可以做到这一点
【解决方案2】:

使用 C 的最佳方法是将 binary128 实现为结构类型

struct binary128 {
    unsigned char data[16];
};

请注意,C 中没有运算符重载,因此您需要将与类型的所有交互(如来自其他类型的赋值、算术运算等)实现为函数。

按照 Shawn 发布的 cmets 中的链接查看更一般的情况:任意宽度整数的实现。

【讨论】:

  • 嗯,我想要一个浮点数,所以我认为这样做的一个好方法是找到更多的东西来帮助我构建实际的数据类型。
【解决方案3】:

我假设你有一些 C++ 目标代码并且你想用纯 C 重写它。一旦你认为最初的 C++ 编译器只是生成 C 代码的预处理器,它应该不会太难。

首先是警告:

  • C 没有提供封装:函数只能具有翻译单元可见性或全局可见性
  • C 没有函数覆盖的规定。一个函数只能有一组参数:使用不同的名称

话虽如此,要翻译 C++ 类,您需要构建一个 C 结构来保存数据成员,并用普通函数替换方法。对于最后一部分,您只需将隐藏的this 替换为显式指针作为附加参数。

【讨论】:

  • 据我所知,结构是最接近类的,但我仍然对 OOP 如何通过通用结构完全工作感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多