如何在 C 中实现 binary128?
How to implement binary128 in C?
我开始尝试使用 C 实现新的数据类型,特别是浮点值。我想出了这种使用 longer_int
实现 binary128
的方法,但我还没有完全理解。
我开始的方式是通过复制代码并修改它来实现它。但是,代码是C++,C不支持OOP,所以我要做的就是尝试翻译代码。
I can't find the C version for longer_int
because this question I once owned (the same account but now deleted) is now deleted and I can't view the links.
借助这些 C++ 文件,我如何使用 C 实现 binary128
?
And just so this question won't get closed, I want to know how to translate the OOP format in longer_int.h
.
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 的最佳方法是将 binary128 实现为结构类型
struct binary128 {
unsigned char data[16];
};
请注意,C 中没有运算符重载,因此您需要将与该类型的所有交互(如来自另一个类型的赋值、算术运算等)实现为函数。
在 Shawn 发表的评论中关注 link 以查看更一般的情况:任意宽度整数的实现。
你应该这样开始:struct
而不是 class
,忽略 public
/private
关键字,构造函数是 return my_int128
。 C 中没有重载,因此每个不同的构造函数必须具有不同的名称。另一种思想流派会说你不需要专门的构造函数,只需要特殊的方法 setters 就可以从 int
、char[]
和 [=16] 复制数据=](我更喜欢这种思想流派)。我在最后举个例子setter
#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);
}
setter:
void set_from_int(my_int128 *li, int num)
{
/* TODO: set li with num */
}
我假设你有一些 C++ 目标代码并且你想用纯 C 重写它。一旦你认为第一个 C++ 编译器只是生成 C 代码的预处理器,它应该不会太难。
首先注意事项:
- C 没有规定封装:函数只能有翻译单元可见性或全局可见性
- C 没有提供函数覆盖。一个函数只能有一组参数:使用不同的名称
也就是说,要翻译 C++ class,您需要构建一个 C 结构来保存数据成员,并用普通函数替换方法。对于最后一部分,您只需将隐藏的 this
替换为显式指针作为附加参数。
我开始尝试使用 C 实现新的数据类型,特别是浮点值。我想出了这种使用 longer_int
实现 binary128
的方法,但我还没有完全理解。
我开始的方式是通过复制代码并修改它来实现它。但是,代码是C++,C不支持OOP,所以我要做的就是尝试翻译代码。
I can't find the C version for
longer_int
because this question I once owned (the same account but now deleted) is now deleted and I can't view the links.
借助这些 C++ 文件,我如何使用 C 实现 binary128
?
And just so this question won't get closed, I want to know how to translate the OOP format in
longer_int.h
.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 的最佳方法是将 binary128 实现为结构类型
struct binary128 {
unsigned char data[16];
};
请注意,C 中没有运算符重载,因此您需要将与该类型的所有交互(如来自另一个类型的赋值、算术运算等)实现为函数。
在 Shawn 发表的评论中关注 link 以查看更一般的情况:任意宽度整数的实现。
你应该这样开始:struct
而不是 class
,忽略 public
/private
关键字,构造函数是 return my_int128
。 C 中没有重载,因此每个不同的构造函数必须具有不同的名称。另一种思想流派会说你不需要专门的构造函数,只需要特殊的方法 setters 就可以从 int
、char[]
和 [=16] 复制数据=](我更喜欢这种思想流派)。我在最后举个例子setter
#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);
}
setter:
void set_from_int(my_int128 *li, int num)
{
/* TODO: set li with num */
}
我假设你有一些 C++ 目标代码并且你想用纯 C 重写它。一旦你认为第一个 C++ 编译器只是生成 C 代码的预处理器,它应该不会太难。
首先注意事项:
- C 没有规定封装:函数只能有翻译单元可见性或全局可见性
- C 没有提供函数覆盖。一个函数只能有一组参数:使用不同的名称
也就是说,要翻译 C++ class,您需要构建一个 C 结构来保存数据成员,并用普通函数替换方法。对于最后一部分,您只需将隐藏的 this
替换为显式指针作为附加参数。