Skip to content

Instantly share code, notes, and snippets.

@darallium
Created October 26, 2025 07:47
Show Gist options
  • Select an option

  • Save darallium/cf3ed70c2f34c5d48f2b4a2f439a3b36 to your computer and use it in GitHub Desktop.

Select an option

Save darallium/cf3ed70c2f34c5d48f2b4a2f439a3b36 to your computer and use it in GitHub Desktop.
#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;
}
@darallium
Copy link
Copy Markdown
Author

result:

  C_offset_int : 1064992206
  C_mult_int   : 155
---------------------------------------------------------
Approx log10 (Test Cases):
| Input (x)         | True Digits     | Approx.         |
|-------------------|-----------------|-----------------|
| 1.0               | 1.0             | 1               |
| 9.9               | 1.0             | 1               |
| 10.0              | 2.0             | 1               |
| 99.9              | 2.0             | 2               |
| 100.0             | 3.0             | 2               |
| 12345.0           | 5.0             | 5               |
| 99999.0           | 5.0             | 6               |
| 100000.0          | 6.0             | 6               |
| 1234567.0         | 7.0             | 7               |
| 9999999.0         | 7.0             | 8               |
| 10000000.0        | 8.0             | 8               |
| 79999998623744.0  | 14.0            | 14              |
---------------------------------------------------------

@darallium
Copy link
Copy Markdown
Author

darallium commented Oct 26, 2025

image image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment