Как реализовать binary128 в C?

Я начал пытаться реализовывать новые типы данных, в частности значения с плавающей запятой, используя C. Я придумал такой способ реализации binary128 с использованием long_int , который я не совсем понял.

То, как я начал, заключалось в том, чтобы реализовать его, скопировав код и изменив его. Однако код написан на C++, а C не поддерживает ООП, поэтому мне нужно попытаться перевести код.

Я не могу найти версию C для longer_int, потому что этот вопрос у меня когда-то был (тот же аккаунт, но теперь удален) теперь удален, и я не могу просмотреть ссылки.

Как с помощью этих файлов C++ реализовать binary128 с помощью C?

И чтобы этот вопрос не был закрыт, я хочу знать, как перевести формат ООП в 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

Этот сайт не является "пожалуйста, напишите для меня код" (особенно не полная библиотека). Если есть часть кода, которую вы не понимаете, вы можете спросить. Но должен быть конкретный вопрос.

xanatos 23.12.2020 13:21

Приведенная вами ссылка не работает...

user9934156 23.12.2020 13:22

@Cowboy_Patrick Какой?

user14793609 23.12.2020 13:26
github.com/vlad-olteanu/longer-int единственная такая ссылка, которую я вижу в комментариях к удаленному вопросу.
Shawn 23.12.2020 13:38

Если вы не возражаете против расширений компилятора, см. gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Floating-Types.html

Shawn 23.12.2020 13:48
longer_int не является типом с плавающей запятой.
ssbssa 23.12.2020 15:38

Этот: stackoverflow.com/questions/65168668/…

user9934156 23.12.2020 20:31

@Cowboy_Patrick Это могут видеть только модераторы и пользователи с > 10 тысячами представителей.

user14793609 24.12.2020 10:08

@Шон Да, это то, что я ищу. Странная вещь заключается в том, что я хотел изменить его, чтобы фактически превратить его в число с плавающей запятой, но я понятия не имею, как это сделать. Попытка double могла бы мне помочь, но я не знала, с чего начать. Спасибо за ссылку. Мне нужно это.

user14793609 24.12.2020 20:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
208
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Лучшим вариантом использования C будет реализация binary128 в качестве типа структуры.

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

Имейте в виду, что в C нет перегрузки операторов, поэтому вам нужно будет реализовать все взаимодействие с типом (например, присваивание из другого типа, арифметические операции и т. д.) как функции.

Перейдите по ссылке в комментариях, опубликованных Шоном, чтобы увидеть более общий случай: реализация целых чисел произвольной ширины.

Что ж, я хотел тип с плавающей запятой, поэтому я думаю, что хорошая форма сделать это — найти больше вещей, которые помогут мне построить фактический тип данных.

user14793609 24.12.2020 20:39
Ответ принят как подходящий

Вы должны начать примерно так: struct вместо class, игнорировать ключевые слова public/private, конструкторы — это методы, которые возвращают my_int128. В C нет перегрузки, поэтому каждый отдельный конструктор должен иметь другое имя. Другая школа мысли сказала бы, что вам не нужны специализированные конструкторы, а просто специальные установщики методов, которые могут копировать данные из int, из char[] и из 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. Попытка все еще с тяжелыми днями работы.

user14793609 24.12.2020 20:36

@MarkGiraffe Это зависит от того, как вы хотите «организовать» свой binary128. Я написал "ТОТО" именно по этой причине. Есть разные способы сделать это

xanatos 24.12.2020 21:20

Я предполагаю, что у вас есть некоторый объектный код C++, и вы хотите переписать его на простом C. Если вы думаете, что первые компиляторы C++ были просто препроцессорами, которые генерировали код C, это не должно быть слишком сложно.

Сначала предостережения:

  • C не предусматривает инкапсуляцию: функции могут иметь видимость только единиц перевода или глобальную видимость.
  • В C нет возможности перезаписывать функции. Одна функция может иметь только один набор параметров: использовать разные имена

При этом, чтобы перевести класс C++, вы создаете структуру C для хранения элементов данных и заменяете методы простыми функциями. В этой последней части вы просто заменяете скрытый this явным указателем в качестве дополнительного параметра.

Насколько я знаю, структуры ближе всего к классам, но я все еще не понимаю, как полноценная ООП работает через универсальную.

user14793609 24.12.2020 20:37

Другие вопросы по теме