The existing options for bin→dec float conversion are all based on the Ryū algorithm, which generates 9 output digits at a time using a table lookup. For users who can't afford the space cost of the table, the table-lookup subroutine is replaced with one that computes the needed table entry on demand, but the algorithm is otherwise unmodified. The performance problem with computing table entries on demand is that now you need to calculate a power of 10 for each 9 digits you output. But if you're calculating a custom power of 10 anyway, it's easier to just compute one, and multiply the _whole_ mantissa by it. This patch adds a header file alongside `float_dec_converter.h`, which replaces the whole Ryū system instead of just the table-lookup routine, implementing this alternative simpler algorithm. The result is accurate enough to satisfy (minimally) the accuracy demands of IEEE 754-2019 even in 128-bit long double. The new float128 test cases demonstrate this by testing the cases closest to the 39-digit rounding boundary. In my tests of generating 39 output digits (the maximum number supported by this algorithm) this code is also both faster and smaller than the USE_DYADIC_FLOAT version of the existing Ryū code.
125 lines
4.8 KiB
JSON
125 lines
4.8 KiB
JSON
{
|
|
"errno": {
|
|
"LIBC_CONF_ERRNO_MODE": {
|
|
"value": "LIBC_ERRNO_MODE_DEFAULT",
|
|
"doc": "The implementation used for errno, acceptable values are LIBC_ERRNO_MODE_DEFAULT, LIBC_ERRNO_MODE_UNDEFINED, LIBC_ERRNO_MODE_THREAD_LOCAL, LIBC_ERRNO_MODE_SHARED, LIBC_ERRNO_MODE_EXTERNAL, and LIBC_ERRNO_MODE_SYSTEM."
|
|
}
|
|
},
|
|
"printf": {
|
|
"LIBC_CONF_PRINTF_DISABLE_FLOAT": {
|
|
"value": false,
|
|
"doc": "Disable printing floating point values in printf and friends."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_INDEX_MODE": {
|
|
"value": false,
|
|
"doc": "Disable index mode in the printf format string."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_WRITE_INT": {
|
|
"value": false,
|
|
"doc": "Disable handling of %n in printf format string."
|
|
},
|
|
"LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE": {
|
|
"value": false,
|
|
"doc": "Use large table for better printf long double performance."
|
|
},
|
|
"LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_DYADIC_FLOAT": {
|
|
"value": false,
|
|
"doc": "Use dyadic float for faster and smaller but less accurate printf doubles."
|
|
},
|
|
"LIBC_CONF_PRINTF_FLOAT_TO_STR_NO_SPECIALIZE_LD": {
|
|
"value": false,
|
|
"doc": "Use the same mode for double and long double in printf."
|
|
},
|
|
"LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_FLOAT320": {
|
|
"value": false,
|
|
"doc": "Use an alternative printf float implementation based on 320-bit floats"
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_FIXED_POINT": {
|
|
"value": false,
|
|
"doc": "Disable printing fixed point values in printf and friends."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_STRERROR": {
|
|
"value": false,
|
|
"doc": "Disable handling of %m to print strerror in printf and friends."
|
|
}
|
|
},
|
|
"scanf": {
|
|
"LIBC_CONF_SCANF_DISABLE_FLOAT": {
|
|
"value": false,
|
|
"doc": "Disable parsing floating point values in scanf and friends."
|
|
},
|
|
"LIBC_CONF_SCANF_DISABLE_INDEX_MODE": {
|
|
"value": false,
|
|
"doc": "Disable index mode in the scanf format string."
|
|
}
|
|
},
|
|
"string": {
|
|
"LIBC_CONF_STRING_UNSAFE_WIDE_READ": {
|
|
"value": false,
|
|
"doc": "Read more than a byte at a time to perform byte-string operations like strlen."
|
|
},
|
|
"LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING": {
|
|
"value": false,
|
|
"doc": "Inserts prefetch for write instructions (PREFETCHW) for memset on x86 to recover performance when hardware prefetcher is disabled."
|
|
}
|
|
},
|
|
"codegen": {
|
|
"LIBC_CONF_KEEP_FRAME_POINTER": {
|
|
"value": true,
|
|
"doc": "Keep frame pointer in functions for better debugging experience."
|
|
},
|
|
"LIBC_CONF_ENABLE_STRONG_STACK_PROTECTOR": {
|
|
"value": true,
|
|
"doc": "Enable -fstack-protector-strong to defend against stack smashing attack."
|
|
}
|
|
},
|
|
"pthread": {
|
|
"LIBC_CONF_TIMEOUT_ENSURE_MONOTONICITY": {
|
|
"value": true,
|
|
"doc": "Automatically adjust timeout to CLOCK_MONOTONIC (default to true). POSIX API may require CLOCK_REALTIME, which can be unstable and leading to unexpected behavior. This option will convert the real-time timestamp to monotonic timestamp relative to the time of call."
|
|
},
|
|
"LIBC_CONF_RAW_MUTEX_DEFAULT_SPIN_COUNT": {
|
|
"value": 100,
|
|
"doc": "Default number of spins before blocking if a mutex is in contention (default to 100)."
|
|
},
|
|
"LIBC_CONF_RWLOCK_DEFAULT_SPIN_COUNT": {
|
|
"value": 100,
|
|
"doc": "Default number of spins before blocking if a rwlock is in contention (default to 100)."
|
|
}
|
|
},
|
|
"math": {
|
|
"LIBC_CONF_MATH_OPTIMIZATIONS": {
|
|
"value": 0,
|
|
"doc": "Configures optimizations for math functions. Values accepted are LIBC_MATH_SKIP_ACCURATE_PASS, LIBC_MATH_SMALL_TABLES, LIBC_MATH_NO_ERRNO, LIBC_MATH_NO_EXCEPT, and LIBC_MATH_FAST."
|
|
},
|
|
"LIBC_CONF_FREXP_INF_NAN_EXPONENT": {
|
|
"value": "",
|
|
"doc": "The value written back to the second parameter when calling frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is unspecified. Configue an explicit exp value for Inf/NaN inputs."
|
|
}
|
|
},
|
|
"qsort": {
|
|
"LIBC_CONF_QSORT_IMPL": {
|
|
"value": "LIBC_QSORT_QUICK_SORT",
|
|
"doc": "Configures sorting algorithm for qsort and qsort_r. Values accepted are LIBC_QSORT_QUICK_SORT, LIBC_QSORT_HEAP_SORT."
|
|
}
|
|
},
|
|
"setjmp": {
|
|
"LIBC_CONF_SETJMP_AARCH64_RESTORE_PLATFORM_REGISTER": {
|
|
"value": true,
|
|
"doc": "Make setjmp save the value of x18, and longjmp restore it. The AArch64 ABI delegates this register to platform ABIs, which can choose whether to make it caller-saved."
|
|
}
|
|
},
|
|
"time": {
|
|
"LIBC_CONF_TIME_64BIT": {
|
|
"value": false,
|
|
"doc": "Force the size of time_t to 64 bits, even on platforms where compatibility considerations would otherwise make it 32-bit."
|
|
}
|
|
},
|
|
"general": {
|
|
"LIBC_ADD_NULL_CHECKS": {
|
|
"value": true,
|
|
"doc": "Add nullptr checks in the library's implementations to some functions for which passing nullptr is undefined behavior."
|
|
}
|
|
}
|
|
}
|