mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 16:18:52 +00:00
big: Remove core:fmt usage + Add a little demo to examples/demo.
This commit is contained in:
+100
-24
@@ -9,8 +9,84 @@
|
||||
*/
|
||||
package math_big
|
||||
|
||||
import "core:fmt"
|
||||
import "core:time"
|
||||
import "core:runtime"
|
||||
|
||||
print_value :: proc(name: string, value: i64) {
|
||||
runtime.print_string("\t")
|
||||
runtime.print_string(name)
|
||||
runtime.print_string(": ")
|
||||
runtime.print_i64(value)
|
||||
runtime.print_string("\n")
|
||||
}
|
||||
|
||||
print_bool :: proc(name: string, value: bool) {
|
||||
runtime.print_string("\t")
|
||||
runtime.print_string(name)
|
||||
if value {
|
||||
runtime.print_string(": true\n")
|
||||
} else {
|
||||
runtime.print_string(": false\n")
|
||||
}
|
||||
}
|
||||
|
||||
print_configation :: proc() {
|
||||
runtime.print_string("Configuration:\n")
|
||||
print_value("_DIGIT_BITS ", _DIGIT_BITS)
|
||||
print_bool ("MATH_BIG_SMALL_MEMORY ", _LOW_MEMORY)
|
||||
print_value("_MIN_DIGIT_COUNT ", _MIN_DIGIT_COUNT)
|
||||
print_value("_MAX_DIGIT_COUNT ", i64(_MAX_DIGIT_COUNT))
|
||||
print_value("_DEFAULT_DIGIT_COUNT ", _DEFAULT_DIGIT_COUNT)
|
||||
print_value("_MAX_COMBA ", _MAX_COMBA)
|
||||
print_value("_WARRAY ", _WARRAY)
|
||||
print_value("_TAB_SIZE ", _TAB_SIZE)
|
||||
print_value("_MAX_WIN_SIZE ", _MAX_WIN_SIZE)
|
||||
print_bool ("MATH_BIG_USE_LUCAS_SELFRIDGE_TEST ", MATH_BIG_USE_LUCAS_SELFRIDGE_TEST)
|
||||
|
||||
runtime.print_string("\nRuntime tunable:\n")
|
||||
print_value("MUL_KARATSUBA_CUTOFF ", i64(MUL_KARATSUBA_CUTOFF))
|
||||
print_value("SQR_KARATSUBA_CUTOFF ", i64(SQR_KARATSUBA_CUTOFF))
|
||||
print_value("MUL_TOOM_CUTOFF ", i64(MUL_TOOM_CUTOFF))
|
||||
print_value("SQR_TOOM_CUTOFF ", i64(SQR_TOOM_CUTOFF))
|
||||
print_value("MAX_ITERATIONS_ROOT_N ", i64(MAX_ITERATIONS_ROOT_N))
|
||||
print_value("FACTORIAL_MAX_N ", i64(FACTORIAL_MAX_N))
|
||||
print_value("FACTORIAL_BINARY_SPLIT_CUTOFF ", i64(FACTORIAL_BINARY_SPLIT_CUTOFF))
|
||||
print_value("FACTORIAL_BINARY_SPLIT_MAX_RECURSIONS", i64(FACTORIAL_BINARY_SPLIT_MAX_RECURSIONS))
|
||||
print_value("FACTORIAL_BINARY_SPLIT_CUTOFF ", i64(FACTORIAL_BINARY_SPLIT_CUTOFF))
|
||||
print_bool ("USE_MILLER_RABIN_ONLY ", USE_MILLER_RABIN_ONLY)
|
||||
print_value("MAX_ITERATIONS_RANDOM_PRIME ", i64(MAX_ITERATIONS_RANDOM_PRIME))
|
||||
}
|
||||
|
||||
print :: proc(name: string, a: ^Int, base := i8(10), print_name := true, newline := true, print_extra_info := false) {
|
||||
assert_if_nil(a)
|
||||
|
||||
as, err := itoa(a, base)
|
||||
defer delete(as)
|
||||
|
||||
cb := internal_count_bits(a)
|
||||
if print_name {
|
||||
runtime.print_string(name)
|
||||
}
|
||||
if err != nil {
|
||||
runtime.print_string("(Error: ")
|
||||
es := Error_String
|
||||
runtime.print_string(es[err])
|
||||
runtime.print_string(")")
|
||||
}
|
||||
runtime.print_string(as)
|
||||
if print_extra_info {
|
||||
runtime.print_string(" (base: ")
|
||||
runtime.print_i64(i64(base))
|
||||
runtime.print_string(", bits: ")
|
||||
runtime.print_i64(i64(cb))
|
||||
runtime.print_string(", digits: ")
|
||||
runtime.print_i64(i64(a.used))
|
||||
runtime.print_string(")")
|
||||
}
|
||||
if newline {
|
||||
runtime.print_string("\n")
|
||||
}
|
||||
}
|
||||
|
||||
Category :: enum {
|
||||
itoa,
|
||||
@@ -35,32 +111,32 @@ Event :: struct {
|
||||
Timings := [Category]Event{}
|
||||
|
||||
print_timings :: proc() {
|
||||
duration :: proc(d: time.Duration) -> (res: string) {
|
||||
switch {
|
||||
case d < time.Microsecond:
|
||||
return fmt.tprintf("%v ns", time.duration_nanoseconds(d))
|
||||
case d < time.Millisecond:
|
||||
return fmt.tprintf("%v µs", time.duration_microseconds(d))
|
||||
case:
|
||||
return fmt.tprintf("%v ms", time.duration_milliseconds(d))
|
||||
}
|
||||
}
|
||||
// duration :: proc(d: time.Duration) -> (res: string) {
|
||||
// switch {
|
||||
// case d < time.Microsecond:
|
||||
// return fmt.tprintf("%v ns", time.duration_nanoseconds(d))
|
||||
// case d < time.Millisecond:
|
||||
// return fmt.tprintf("%v µs", time.duration_microseconds(d))
|
||||
// case:
|
||||
// return fmt.tprintf("%v ms", time.duration_milliseconds(d))
|
||||
// }
|
||||
// }
|
||||
|
||||
for v in Timings {
|
||||
if v.count > 0 {
|
||||
fmt.println("\nTimings:")
|
||||
break
|
||||
}
|
||||
}
|
||||
// for v in Timings {
|
||||
// if v.count > 0 {
|
||||
// fmt.println("\nTimings:")
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
|
||||
for v, i in Timings {
|
||||
if v.count > 0 {
|
||||
avg_ticks := time.Duration(f64(v.ticks) / f64(v.count))
|
||||
avg_cycles := f64(v.cycles) / f64(v.count)
|
||||
// for v, i in Timings {
|
||||
// if v.count > 0 {
|
||||
// avg_ticks := time.Duration(f64(v.ticks) / f64(v.count))
|
||||
// avg_cycles := f64(v.cycles) / f64(v.count)
|
||||
|
||||
fmt.printf("\t%v: %s / %v cycles (avg), %s / %v cycles (total, %v calls)\n", i, duration(avg_ticks), avg_cycles, duration(v.ticks), v.cycles, v.count)
|
||||
}
|
||||
}
|
||||
// fmt.printf("\t%v: %s / %v cycles (avg), %s / %v cycles (total, %v calls)\n", i, duration(avg_ticks), avg_cycles, duration(v.ticks), v.cycles, v.count)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
@(deferred_in_out=_SCOPE_END)
|
||||
|
||||
Reference in New Issue
Block a user