1
0
mirror of synced 2025-02-26 14:21:39 +01:00

tools: Added IEEE 756 floating point number tester

This commit is contained in:
WerWolv 2022-05-29 14:57:59 +02:00
parent efed07ac8b
commit f1b2d5881e
10 changed files with 826 additions and 537 deletions

View File

@ -72,6 +72,18 @@ namespace hex {
return (value ^ mask) - mask; return (value ^ mask) - mask;
} }
template<hex::integral T>
constexpr inline T swapBitOrder(size_t numBits, T value) {
T result = 0x00;
for (size_t bit = 0; bit < numBits; bit++) {
result <<= 1;
result |= (value & (1 << bit)) != 0;
}
return result;
}
template<class... Ts> template<class... Ts>
struct overloaded : Ts... { using Ts::operator()...; }; struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> template<class... Ts>

View File

@ -134,4 +134,6 @@ namespace ImGui {
bool InputScalarCallback(const char* label, ImGuiDataType data_type, void* p_data, const char* format, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data); bool InputScalarCallback(const char* label, ImGuiDataType data_type, void* p_data, const char* format, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data);
void HideTooltip(); void HideTooltip();
bool BitCheckbox(const char* label, bool* v);
} }

View File

@ -590,4 +590,47 @@ namespace ImGui {
} }
} }
bool BitCheckbox(const char* label, bool* v) {
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
const ImVec2 size = ImVec2(CalcTextSize("0").x + style.FramePadding.x * 2, GetFrameHeight());
const ImVec2 pos = window->DC.CursorPos;
const ImRect total_bb(pos, pos + size);
ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, id))
{
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return false;
}
bool hovered, held;
bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
if (pressed)
{
*v = !(*v);
MarkItemEdited(id);
}
const ImRect check_bb(pos, pos + size);
RenderNavHighlight(total_bb, id);
RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
RenderText(check_bb.Min + style.FramePadding, *v ? "1" : "0");
ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
if (label_size.x > 0.0f)
RenderText(label_pos, label);
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return pressed;
}
} }

View File

@ -84,7 +84,7 @@ namespace hex::plugin::builtin {
[](auto buffer, auto endian, auto style) { [](auto buffer, auto endian, auto style) {
hex::unused(endian, style); hex::unused(endian, style);
std::string binary = hex::format("0b{:b}", buffer[0]); std::string binary = hex::format("0b{:08b}", buffer[0]);
return [binary] { return [binary] {
ImGui::TextUnformatted(binary.c_str()); ImGui::TextUnformatted(binary.c_str());

View File

@ -512,8 +512,6 @@ namespace hex::plugin::builtin {
ConvertBases(base); ConvertBases(base);
} }
}
void drawPermissionsCalculator() { void drawPermissionsCalculator() {
static bool setuid, setgid, sticky; static bool setuid, setgid, sticky;
static bool r[3], w[3], x[3]; static bool r[3], w[3], x[3];
@ -1143,6 +1141,169 @@ namespace hex::plugin::builtin {
} }
} }
void drawIEEE756Helper() {
static u128 value = 0x00;
static int exponentBitCount = 8, mantissaBitCount = 23;
const static auto BitCheckbox = [](u8 bit) {
bool checkbox = false;
checkbox = (value & (u128(1) << bit)) != 0;
ImGui::BitCheckbox("##checkbox", &checkbox);
value = (value & ~(u128(1) << bit)) | (u128(checkbox) << bit);
};
const static auto BitCheckboxes = [](u32 startBit, u32 count) {
for (u32 i = 0; i < count; i++) {
ImGui::PushID(startBit - i);
BitCheckbox(startBit - i);
ImGui::SameLine(0, 0);
ImGui::PopID();
}
};
const auto totalBitCount = 1 + exponentBitCount + mantissaBitCount;
const auto signBitPosition = totalBitCount - 0;
const auto exponentBitPosition = totalBitCount - 1;
const auto mantissaBitPosition = totalBitCount - 1 - exponentBitCount;
const static auto ExtractBits = [](u32 startBit, u32 count) {
return hex::extract(startBit, startBit - (count - 1), value);
};
const auto signBits = ExtractBits(signBitPosition, 1);
const auto exponentBits = ExtractBits(exponentBitPosition, exponentBitCount);
const auto mantissaBits = ExtractBits(mantissaBitPosition, mantissaBitCount);
if (ImGui::BeginTable("##outer", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoKeepColumnsVisible | ImGuiTableFlags_ScrollX, ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 4))) {
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.sign"_lang);
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.exponent"_lang);
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.mantissa"_lang);
ImGui::TableHeadersRow();
ImGui::TableNextRow();
// Sign
ImGui::TableNextColumn();
ImGui::Indent(20_scaled);
BitCheckboxes(signBitPosition, 1);
ImGui::Unindent(20_scaled);
// Exponent
ImGui::TableNextColumn();
BitCheckboxes(exponentBitPosition, exponentBitCount);
// Exponent
ImGui::TableNextColumn();
BitCheckboxes(mantissaBitPosition, mantissaBitCount);
ImGui::EndTable();
}
{
ImGui::SliderInt("hex.builtin.tools.ieee756.exponent_size"_lang, &exponentBitCount, 1, 128 - mantissaBitCount);
ImGui::SliderInt("hex.builtin.tools.ieee756.mantissa_size"_lang, &mantissaBitCount, 1, 128 - exponentBitCount);
ImGui::Separator();
if (ImGui::Button("hex.builtin.tools.ieee756.half_precision"_lang)) { exponentBitCount = 5; mantissaBitCount = 10; }
ImGui::SameLine();
if (ImGui::Button("hex.builtin.tools.ieee756.singe_precision"_lang)) { exponentBitCount = 8; mantissaBitCount = 23; }
ImGui::SameLine();
if (ImGui::Button("hex.builtin.tools.ieee756.double_precision"_lang)) { exponentBitCount = 11; mantissaBitCount = 52; }
ImGui::Separator();
ImGui::NewLine();
}
{
const auto exponentBias = (u128(1) << (exponentBitCount - 1)) - 1;
const long double signValue = signBits == 0 ? 1 : -1;
const long double exponentValue = exponentBits == 0 ? 0 : std::pow<long double>(2, i128(exponentBits) - i128(exponentBias));
const long double mantissaValue = [mantissaBitPosition] {
long double mantissa = 1.0;
for (i32 bit = 0; bit < mantissaBitCount; bit++) {
if (hex::extract(mantissaBitPosition - bit, mantissaBitPosition - bit, value) != 0)
mantissa += 1.0 / static_cast<long double>(u128(1) << (bit + 1));
}
return mantissa;
}();
if (ImGui::BeginTable("##result", 5, ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) {
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.type"_lang, ImGuiTableColumnFlags_IndentEnable);
ImGui::TableSetupColumn("##padding", ImGuiTableColumnFlags_WidthFixed, 30_scaled);
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.formula"_lang);
ImGui::TableSetupColumn("##equals");
ImGui::TableSetupColumn("hex.builtin.tools.ieee756.result.title"_lang);
ImGui::TableHeadersRow();
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::TextUnformatted("hex.builtin.tools.ieee756.sign"_lang);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TextFormatted("(-1)^{0}", signBits);
ImGui::TableNextColumn();
ImGui::TextUnformatted("=");
ImGui::TableNextColumn();
ImGui::TextFormatted("{0}", signValue);
ImGui::TableNextColumn();
ImGui::TextUnformatted("hex.builtin.tools.ieee756.exponent"_lang);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TextFormatted("2^({0} - {1})", exponentBits, exponentBias);
ImGui::TableNextColumn();
ImGui::TextUnformatted("=");
ImGui::TableNextColumn();
ImGui::TextFormatted("{0}", exponentValue);
ImGui::TableNextColumn();
ImGui::TextUnformatted("hex.builtin.tools.ieee756.mantissa"_lang);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TextFormatted("1.0 + 0x{0:02X}", mantissaBits);
ImGui::TableNextColumn();
ImGui::TextUnformatted("=");
ImGui::TableNextColumn();
ImGui::TextFormatted("{0:.2f}", mantissaValue);
ImGui::TableNextRow();
ImGui::TextUnformatted(" ");
ImGui::Separator();
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::TextUnformatted("hex.builtin.tools.ieee756.result.float"_lang);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TextFormatted("{0} * {1} * {2}", signValue, exponentValue, mantissaValue);
ImGui::TableNextColumn();
ImGui::TextUnformatted("=");
ImGui::TableNextColumn();
ImGui::TextFormatted("{0:.2f}", signValue * exponentValue * mantissaValue);
ImGui::TableNextColumn();
ImGui::TextUnformatted("hex.builtin.tools.ieee756.result.hex"_lang);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::TextUnformatted("=");
ImGui::TableNextColumn();
ImGui::TextFormatted("0x{0:02X}", value);
ImGui::EndTable();
}
}
}
}
void registerToolEntries() { void registerToolEntries() {
ContentRegistry::Tools::add("hex.builtin.tools.demangler", drawDemangler); ContentRegistry::Tools::add("hex.builtin.tools.demangler", drawDemangler);
ContentRegistry::Tools::add("hex.builtin.tools.ascii_table", drawASCIITable); ContentRegistry::Tools::add("hex.builtin.tools.ascii_table", drawASCIITable);
@ -1154,6 +1315,7 @@ namespace hex::plugin::builtin {
ContentRegistry::Tools::add("hex.builtin.tools.file_uploader", drawFileUploader); ContentRegistry::Tools::add("hex.builtin.tools.file_uploader", drawFileUploader);
ContentRegistry::Tools::add("hex.builtin.tools.wiki_explain", drawWikiExplainer); ContentRegistry::Tools::add("hex.builtin.tools.wiki_explain", drawWikiExplainer);
ContentRegistry::Tools::add("hex.builtin.tools.file_tools", drawFileTools); ContentRegistry::Tools::add("hex.builtin.tools.file_tools", drawFileTools);
ContentRegistry::Tools::add("hex.builtin.tools.ieee756", drawIEEE756Helper);
} }
} }

View File

@ -641,6 +641,20 @@ namespace hex::plugin::builtin {
{ "hex.builtin.tools.file_tools.combiner.error.open_output", "Erstellen der Zieldatei fehlgeschlagen" }, { "hex.builtin.tools.file_tools.combiner.error.open_output", "Erstellen der Zieldatei fehlgeschlagen" },
{ "hex.builtin.tools.file_tools.combiner.open_input", "Öffnen der Inputdatei {0} fehlgeschlagen" }, { "hex.builtin.tools.file_tools.combiner.open_input", "Öffnen der Inputdatei {0} fehlgeschlagen" },
{ "hex.builtin.tools.file_tools.combiner.success", "Dateien erfolgreich kombiniert!" }, { "hex.builtin.tools.file_tools.combiner.success", "Dateien erfolgreich kombiniert!" },
{ "hex.builtin.tools.ieee756", "IEEE 756 Fliesskommazahl Tester" },
{ "hex.builtin.tools.ieee756.sign", "Vorzeichen" },
{ "hex.builtin.tools.ieee756.exponent", "Exponent" },
{ "hex.builtin.tools.ieee756.mantissa", "Mantisse" },
{ "hex.builtin.tools.ieee756.exponent_size", "Exponentengrösse" },
{ "hex.builtin.tools.ieee756.mantissa_size", "Mantissengrösse" },
{ "hex.builtin.tools.ieee756.half_precision", "Half Precision" },
{ "hex.builtin.tools.ieee756.singe_precision", "Single Precision" },
{ "hex.builtin.tools.ieee756.double_precision", "Double Precision" },
{ "hex.builtin.tools.ieee756.type", "Typ" },
{ "hex.builtin.tools.ieee756.formula", "Formel" },
{ "hex.builtin.tools.ieee756.result.title", "Resultat" },
{ "hex.builtin.tools.ieee756.result.float", "Fliesskomma Resultat" },
{ "hex.builtin.tools.ieee756.result.hex", "Hexadezimal Resultat" },
{ "hex.builtin.setting.imhex", "ImHex" }, { "hex.builtin.setting.imhex", "ImHex" },
{ "hex.builtin.setting.imhex.recent_files", "Kürzlich geöffnete Dateien" }, { "hex.builtin.setting.imhex.recent_files", "Kürzlich geöffnete Dateien" },

View File

@ -645,6 +645,20 @@ namespace hex::plugin::builtin {
{ "hex.builtin.tools.file_tools.combiner.error.open_output", "Failed to create output file" }, { "hex.builtin.tools.file_tools.combiner.error.open_output", "Failed to create output file" },
{ "hex.builtin.tools.file_tools.combiner.open_input", "Failed to open input file {0}" }, { "hex.builtin.tools.file_tools.combiner.open_input", "Failed to open input file {0}" },
{ "hex.builtin.tools.file_tools.combiner.success", "Files combined successfully!" }, { "hex.builtin.tools.file_tools.combiner.success", "Files combined successfully!" },
{ "hex.builtin.tools.ieee756", "IEEE 756 Floating Point Tester" },
{ "hex.builtin.tools.ieee756.sign", "Sign" },
{ "hex.builtin.tools.ieee756.exponent", "Exponent" },
{ "hex.builtin.tools.ieee756.mantissa", "Mantissa" },
{ "hex.builtin.tools.ieee756.exponent_size", "Exponent Size" },
{ "hex.builtin.tools.ieee756.mantissa_size", "Mantissa Size" },
{ "hex.builtin.tools.ieee756.half_precision", "Half Precision" },
{ "hex.builtin.tools.ieee756.singe_precision", "Single Precision" },
{ "hex.builtin.tools.ieee756.double_precision", "Double Precision" },
{ "hex.builtin.tools.ieee756.type", "Type" },
{ "hex.builtin.tools.ieee756.formula", "Formula" },
{ "hex.builtin.tools.ieee756.result.title", "Result" },
{ "hex.builtin.tools.ieee756.result.float", "Floating Point Result" },
{ "hex.builtin.tools.ieee756.result.hex", "Hexadecimal Result" },
{ "hex.builtin.setting.imhex", "ImHex" }, { "hex.builtin.setting.imhex", "ImHex" },
{ "hex.builtin.setting.imhex.recent_files", "Recent Files" }, { "hex.builtin.setting.imhex.recent_files", "Recent Files" },

View File

@ -646,6 +646,20 @@ namespace hex::plugin::builtin {
{ "hex.builtin.tools.file_tools.combiner.error.open_output", "Impossibile creare file di output" }, { "hex.builtin.tools.file_tools.combiner.error.open_output", "Impossibile creare file di output" },
{ "hex.builtin.tools.file_tools.combiner.open_input", "Impossibile aprire file di input {0}" }, { "hex.builtin.tools.file_tools.combiner.open_input", "Impossibile aprire file di input {0}" },
{ "hex.builtin.tools.file_tools.combiner.success", "File combinato con successo!" }, { "hex.builtin.tools.file_tools.combiner.success", "File combinato con successo!" },
//{ "hex.builtin.tools.ieee756", "IEEE 756 Floating Point Tester" },
//{ "hex.builtin.tools.ieee756.sign", "Sign" },
//{ "hex.builtin.tools.ieee756.exponent", "Exponent" },
//{ "hex.builtin.tools.ieee756.mantissa", "Mantissa" },
//{ "hex.builtin.tools.ieee756.exponent_size", "Exponent Size" },
//{ "hex.builtin.tools.ieee756.mantissa_size", "Mantissa Size" },
//{ "hex.builtin.tools.ieee756.half_precision", "Half Precision" },
//{ "hex.builtin.tools.ieee756.singe_precision", "Single Precision" },
//{ "hex.builtin.tools.ieee756.double_precision", "Double Precision" },
//{ "hex.builtin.tools.ieee756.type", "Type" },
//{ "hex.builtin.tools.ieee756.formula", "Formula" },
//{ "hex.builtin.tools.ieee756.result.title", "Result" },
//{ "hex.builtin.tools.ieee756.result.float", "Floating Point Result" },
//{ "hex.builtin.tools.ieee756.result.hex", "Hexadecimal Result" },
{ "hex.builtin.setting.imhex", "ImHex" }, { "hex.builtin.setting.imhex", "ImHex" },
{ "hex.builtin.setting.imhex.recent_files", "File recenti" }, { "hex.builtin.setting.imhex.recent_files", "File recenti" },

View File

@ -646,6 +646,20 @@ namespace hex::plugin::builtin {
{ "hex.builtin.tools.file_tools.combiner.error.open_output", "出力ファイルを作成できませんでした" }, { "hex.builtin.tools.file_tools.combiner.error.open_output", "出力ファイルを作成できませんでした" },
{ "hex.builtin.tools.file_tools.combiner.open_input", "入力ファイル {0} を開けませんでした" }, { "hex.builtin.tools.file_tools.combiner.open_input", "入力ファイル {0} を開けませんでした" },
{ "hex.builtin.tools.file_tools.combiner.success", "ファイルの結合に成功しました!" }, { "hex.builtin.tools.file_tools.combiner.success", "ファイルの結合に成功しました!" },
//{ "hex.builtin.tools.ieee756", "IEEE 756 Floating Point Tester" },
//{ "hex.builtin.tools.ieee756.sign", "Sign" },
//{ "hex.builtin.tools.ieee756.exponent", "Exponent" },
//{ "hex.builtin.tools.ieee756.mantissa", "Mantissa" },
//{ "hex.builtin.tools.ieee756.exponent_size", "Exponent Size" },
//{ "hex.builtin.tools.ieee756.mantissa_size", "Mantissa Size" },
//{ "hex.builtin.tools.ieee756.half_precision", "Half Precision" },
//{ "hex.builtin.tools.ieee756.singe_precision", "Single Precision" },
//{ "hex.builtin.tools.ieee756.double_precision", "Double Precision" },
//{ "hex.builtin.tools.ieee756.type", "Type" },
//{ "hex.builtin.tools.ieee756.formula", "Formula" },
//{ "hex.builtin.tools.ieee756.result.title", "Result" },
//{ "hex.builtin.tools.ieee756.result.float", "Floating Point Result" },
//{ "hex.builtin.tools.ieee756.result.hex", "Hexadecimal Result" },
{ "hex.builtin.setting.imhex", "ImHex" }, { "hex.builtin.setting.imhex", "ImHex" },
{ "hex.builtin.setting.imhex.recent_files", "最近開いたファイル" }, { "hex.builtin.setting.imhex.recent_files", "最近開いたファイル" },

View File

@ -639,6 +639,20 @@ namespace hex::plugin::builtin {
{ "hex.builtin.tools.file_tools.combiner.error.open_output", "创建输出文件失败!" }, { "hex.builtin.tools.file_tools.combiner.error.open_output", "创建输出文件失败!" },
{ "hex.builtin.tools.file_tools.combiner.open_input", "打开输入文件 {0} 失败" }, { "hex.builtin.tools.file_tools.combiner.open_input", "打开输入文件 {0} 失败" },
{ "hex.builtin.tools.file_tools.combiner.success", "文件合并成功!" }, { "hex.builtin.tools.file_tools.combiner.success", "文件合并成功!" },
//{ "hex.builtin.tools.ieee756", "IEEE 756 Floating Point Tester" },
//{ "hex.builtin.tools.ieee756.sign", "Sign" },
//{ "hex.builtin.tools.ieee756.exponent", "Exponent" },
//{ "hex.builtin.tools.ieee756.mantissa", "Mantissa" },
//{ "hex.builtin.tools.ieee756.exponent_size", "Exponent Size" },
//{ "hex.builtin.tools.ieee756.mantissa_size", "Mantissa Size" },
//{ "hex.builtin.tools.ieee756.half_precision", "Half Precision" },
//{ "hex.builtin.tools.ieee756.singe_precision", "Single Precision" },
//{ "hex.builtin.tools.ieee756.double_precision", "Double Precision" },
//{ "hex.builtin.tools.ieee756.type", "Type" },
//{ "hex.builtin.tools.ieee756.formula", "Formula" },
//{ "hex.builtin.tools.ieee756.result.title", "Result" },
//{ "hex.builtin.tools.ieee756.result.float", "Floating Point Result" },
//{ "hex.builtin.tools.ieee756.result.hex", "Hexadecimal Result" },
{ "hex.builtin.setting.imhex", "ImHex" }, { "hex.builtin.setting.imhex", "ImHex" },
{ "hex.builtin.setting.imhex.recent_files", "最近文件" }, { "hex.builtin.setting.imhex.recent_files", "最近文件" },