|
85 | 85 | ; Output: '( '(upper-ampl-bound lower-ampl-bound) ...) with len(srcs) number of elements |
86 | 86 | (define (get-bounds op z srcs) |
87 | 87 | (case (object-name op) |
| 88 | + [(ival-neg ival-neg!) |
| 89 | + ; Γ[*]'x = 1 |
| 90 | + ; ↑ampl[*]'x = 0 |
| 91 | + ; ↓ampl[*]'x = 0 |
| 92 | + (define x (first srcs)) |
| 93 | + (list (cons 0 0))] ; bounds per x |
| 94 | + |
| 95 | + |
88 | 96 | [(ival-mult ival-mult!) |
89 | 97 | ; Γ[*]'x = 1 |
90 | 98 | ; ↑ampl[*]'x = logspan(y) |
|
111 | 119 | (list (cons (logspan y) 0) ; bounds per x |
112 | 120 | (cons (+ (logspan x) (* 2 (logspan y))) 0))] ; bounds per y |
113 | 121 |
|
114 | | - [(ival-sqrt ival-cbrt) |
| 122 | + [(ival-sqrt ival-cbrt ival-sqrt! ival-cbrt!) |
115 | 123 | ; Γ[sqrt]'x = 0.5 |
116 | 124 | ; ↑ampl[sqrt]'x = logspan(x)/2 - 1 |
117 | 125 | ; ↓ampl[sqrt]'x = 0 |
|
180 | 188 | y-slack) |
181 | 189 | 0)))] ; bounds per y |
182 | 190 |
|
183 | | - [(ival-exp ival-exp2) |
| 191 | + [(ival-exp ival-exp2 ival-exp! ival-exp2!) |
184 | 192 | ; Γ[exp & exp2]'x = |x| & |x*ln(2)| |
185 | 193 | ; ↑ampl[exp & exp2]'x = maxlog(x) + logspan(z) |
186 | 194 | ; ↓ampl[exp & exp2]'x = minlog(x) |
|
224 | 232 | (- (- 2) (maxlog z #:less-slack #t)))) |
225 | 233 | (list (cons (+ (- (maxlog x) (minlog z)) (min (maxlog x) 0)) 0)))] |
226 | 234 |
|
227 | | - [(ival-sinh) |
| 235 | + [(ival-sinh ival-sinh!) |
228 | 236 | ; Γ[sinh]'x = |x * cosh(x) / sinh(x)| |
229 | 237 | ; ↑ampl[sinh]'x = maxlog(x) + logspan(z) - min(minlog(x), 0) |
230 | 238 | ; ↓ampl[sinh]'x = max(0, minlog(x)) |
|
234 | 242 | (max 0 (minlog x #:less-slack #t)))) |
235 | 243 | (list (cons (- (+ (maxlog x) (logspan z)) (min (minlog x) 0)) 0)))] |
236 | 244 |
|
237 | | - [(ival-cosh) |
| 245 | + [(ival-cosh ival-cosh!) |
238 | 246 | ; Γ[cosh]'x = |x * sinh(x) / cosh(x)| |
239 | 247 | ; ↑ampl[cosh]'x = maxlog(x) + logspan(z) + min(maxlog(x), 0) |
240 | 248 | ; ↓ampl[cosh]'x = max(0, minlog(x) - 1) |
|
244 | 252 | (max 0 (- (minlog x #:less-slack #t) 1)))) |
245 | 253 | (list (cons (+ (maxlog x) (logspan z) (min (maxlog x) 0)) 0)))] |
246 | 254 |
|
247 | | - [(ival-log ival-log2 ival-log10) |
| 255 | + [(ival-log ival-log2 ival-log10 ival-log! ival-log2! ival-log10!) |
248 | 256 | ; Γ[log & log2 & log10]'x = |1 / ln(x)| & |ln(2) / ln(x)| & |ln(10) / ln(x)| |
249 | 257 | ; ↑ampl[log & log2 & log10]'x = logspan(x) - minlog(z) + 1 |
250 | 258 | ; ↓ampl[log & log2 & log10]'x = - maxlog(z) |
|
253 | 261 | (list (cons (+ (- (logspan x) (minlog z)) 1) (- (maxlog z #:less-slack #t)))) |
254 | 262 | (list (cons (+ (- (logspan x) (minlog z)) 1) 0)))] |
255 | 263 |
|
256 | | - [(ival-asin) |
| 264 | + [(ival-asin ival-asin!) |
257 | 265 | ; Γ[asin]'x = |x / (sqrt(1-x^2) * arcsin(x))| |
258 | 266 | ; ↑ampl[asin]'x = | slack, if maxlog(z) > 1 |
259 | 267 | ; | 1 else |
|
263 | 271 | (cons (get-slack) 0) ; assumes that log[1-x^2]/2 is equal to slack |
264 | 272 | (cons 1 0)))] |
265 | 273 |
|
266 | | - [(ival-acos) |
| 274 | + [(ival-acos ival-acos!) |
267 | 275 | ; Γ[acos]'x = |-x / (sqrt(1-x^2) * arccos(x))| |
268 | 276 | ; ↑ampl[acos]'x = | slack, if maxlog(x) >= 0 |
269 | 277 | ; | 0 else |
|
273 | 281 | (cons (get-slack) 0) ; assumes that log[1-x^2]/2 is equal to slack |
274 | 282 | (cons 0 0)))] |
275 | 283 |
|
276 | | - [(ival-atan) |
| 284 | + [(ival-atan ival-atan!) |
277 | 285 | ; Γ[atan]'x = | x / ((1+x^2) * arctan(x))| |
278 | 286 | ; ↑ampl[atan]'x = - min(|minlog(x)|, |maxlog(x)|) - minlog(z) + logspan(x) |
279 | 287 | ; ↓ampl[atan]'x = - max(|minlog(x)|, |maxlog(x)|) - maxlog(z) - 2 |
|
306 | 314 | (cons (+ (- (maxlog x) (minlog z)) slack) 0))] ; bounds per y |
307 | 315 |
|
308 | 316 | ; Currently log1p has a very poor approximation |
309 | | - [(ival-log1p) |
| 317 | + [(ival-log1p ival-log1p!) |
310 | 318 | ; Γ[log1p]'x ~ |x * log1p(x) / (1+x)| |
311 | 319 | ; ↑ampl[log1p]'x = | maxlog(x) - minlog(z) + slack, if x is negative |
312 | 320 | ; | maxlog(x) - minlog(z), else |
|
320 | 328 | (cons (- (maxlog x) (minlog z)) 0)))] |
321 | 329 |
|
322 | 330 | ; Currently expm1 has a very poor solution for negative values |
323 | | - [(ival-expm1) |
| 331 | + [(ival-expm1 ival-expm1!) |
324 | 332 | ; Γ[expm1]'x = |x * e^x / expm1| |
325 | 333 | ; ↑ampl[expm1]'x = max(1 + maxlog(x), 1 + maxlog(x) - minlog(z)) |
326 | 334 | ; ↓ampl[expm1]'x = 0 |
|
344 | 352 | (cons (- (+ (maxlog x) (maxlog y)) (* 2 (min (minlog x) (minlog y))) (minlog z)) |
345 | 353 | 0)))] |
346 | 354 |
|
347 | | - [(ival-tanh) |
| 355 | + [(ival-tanh ival-tanh!) |
348 | 356 | ; Γ[tanh]'x = |x / (sinh(x) * cosh(x))| |
349 | 357 | ; ↑ampl[tanh]'x = logspan(z) + logspan(x) |
350 | 358 | ; ↓ampl[tanh]'x = 0 |
351 | 359 | (define x (first srcs)) |
352 | 360 | (list (cons (+ (logspan z) (logspan x)) 0))] |
353 | 361 |
|
354 | | - [(ival-atanh) |
| 362 | + [(ival-atanh ival-atanh!) |
355 | 363 | ; Γ[atanh]'x = |x / (log(1-x^2) * atanh(x))| |
356 | 364 | ; ↑ampl[atanh]'x = | 1, if x < 0.5 |
357 | 365 | ; | slack |
|
361 | 369 | (cons (get-slack) 0) |
362 | 370 | (cons 1 0)))] |
363 | 371 |
|
364 | | - [(ival-acosh) |
| 372 | + [(ival-acosh ival-acosh!) |
365 | 373 | ; Γ[acosh]'x = |x / (sqrt(x-1) * sqrt(x+1) * acosh)| |
366 | 374 | ; ↑ampl[acosh]'x = | -minlog(z) + slack, if minlog(z) < 2 |
367 | 375 | ; | 0 |
|
399 | 407 | (define n (cdr srcs)) ; n is already a floor(log(n)) |
400 | 408 | (list (cons (- (maxlog x) n (- (max (abs (maxlog z)) (abs (minlog z)))) -3) 0))] |
401 | 409 |
|
| 410 | + ; TODO |
| 411 | + ; hypot |
| 412 | + |
402 | 413 | ; TODO |
403 | 414 | ; ↑ampl[...] = slack |
404 | 415 | ; ↓ampl[...] = 0 |
405 | | - [(ival-erfc ival-erf ival-lgamma ival-tgamma ival-asinh ival-logb) (list (cons (get-slack) 0))] |
| 416 | + [(ival-erfc ival-erf ival-erfc! ival-erf! ival-lgamma ival-tgamma ival-asinh ival-asinh! ival-logb) (list (cons (get-slack) 0))] |
406 | 417 |
|
407 | 418 | ; TODO |
408 | 419 | ; ↑ampl[...] = slack |
409 | 420 | ; ↓ampl[...] = 0 |
410 | | - [(ival-ceil ival-floor ival-rint ival-round ival-trunc) (list (cons (get-slack) 0))] |
| 421 | + [(ival-ceil ival-floor ival-rint ival-rint! ival-round ival-trunc) (list (cons (get-slack) 0))] |
411 | 422 |
|
412 | 423 | [else (map (λ (_) (cons 0 0)) srcs)])) ; exponents for arguments |
0 commit comments