Created
October 26, 2025 07:47
-
-
Save darallium/cf3ed70c2f34c5d48f2b4a2f439a3b36 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdint.h> | |
| #include <stdio.h> | |
| #include <math.h> | |
| #include <time.h> | |
| int fast_approx_log10(float x, uint32_t C_offset, uint32_t C_mult) { | |
| uint32_t X = *(uint32_t*)&x; | |
| uint64_t diff = (uint64_t)X - C_offset; | |
| uint32_t shift = (uint32_t)((diff * C_mult) >> 32); | |
| int D = (int)shift + 1; | |
| return D; | |
| } | |
| float log10_standard(float x) { | |
| return floor(log10((double)x)) + 1; | |
| } | |
| int main() { | |
| // --- マジックナンバーの導出 --- | |
| const double L = pow(2, 23); | |
| const double B = 127.0; | |
| const double sigma = 0.043035666028; | |
| const double C_offset_double = L * (B - sigma); | |
| const uint32_t C_offset = (uint32_t)C_offset_double; | |
| const double C_divider_double = L * log2(10.0); | |
| const double C_mult_double = pow(2, 32) / C_divider_double; | |
| const uint32_t C_mult = (uint32_t)ceil(C_mult_double); | |
| printf(" C_offset_int : %u\n", C_offset); | |
| printf(" C_mult_int : %u\n", C_mult); | |
| printf("---------------------------------------------------------\n"); | |
| float test_cases[] = {1.0f, 9.9f, 10.0f, 99.9f, 100.0f, 12345.0f, 99999.0f, 100000.0f, 1234567.0f, 9999999.0f, 10000000.0f,8e13}; | |
| printf("Approx log10 (Test Cases):\n"); | |
| printf("| %-17s | %-15s | %-15s |\n", "Input (x)", "True Digits", "Approx."); | |
| printf("|-------------------|-----------------|-----------------|\n"); | |
| for (int i = 0; i < sizeof(test_cases) / sizeof(float); ++i) { | |
| float x = test_cases[i]; | |
| float true_digits = log10_standard(x); | |
| int approx_digits = fast_approx_log10(x, C_offset, C_mult); | |
| printf("| %-17.1f | %-15.1f | %-15d |\n", x, true_digits, approx_digits); | |
| } | |
| printf("---------------------------------------------------------\n"); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment


result: