2014-03-04 2 views
5

Что такое самый простой способ получить машину epsilon в Go (golang)? Как насчет других аспектов чисел с плавающей запятой, таких как точность, минимальная экспонента, максимальная экспонента, колебания и т. Д.?Самый простой способ получить машину epsilon в go (golang)

Я понимаю, что существует математическая/const-упаковка с максимальным и минимальным для разных типов с плавающей запятой (http://golang.org/src/pkg/math/const.go), но никакой другой информации.

Одна из причин, по которой я хотел бы знать, состоит в том, чтобы убедиться, что я достиг максимальной точности для данного расчета, который машина может сделать, чтобы я не ушел раньше или попробовал дольше, чем нужно.

Другое просто для любопытства.

Благодаря

EDIT:

Для удовольствия я посмотрел в некоторых заметках из школы о том, как рассчитать эпсилон вручную для потех и вот приблизительный перевод с C++ http://play.golang.org/p/XOXwIdNfsa пользоваться

EDIT: комментарий снизу (спасибо за более идиоматических способ нахождения эпсилон):

epsilon := math.Nextafter(1, 2) - 1 Использование Playground - Nick Craig-Wood 5 марта в 8:07

ответ

8

Это не определено, я обнаружил, что проблема будет решена в «работает как задумано» на выпуск трекере:

https://code.google.com/p/go/issues/detail?id=966

Предложение кажется, использовать math.Nextafter для получения если вам это нужно.

В частности, формула равна math.Nextafter(1.0,2.0)-1.0 (вторым аргументом может быть любое число, большее 1,0).

+0

ссылка для ленивых http://golang.org/pkg/math/#Nextafter ... спасибо! – sbditto85

+4

Использование 'epsilon: = math.Nextafter (1, 2) - 1' [Playground] (http://play.golang.org/p/EkigXdFDQE) –

1

7.0/3 - 4./3 - 1. должен работать на любом языке, насколько я понимаю, я мог ошибаться.

package main 

import "fmt" 

func main() { 
    f32 := float32(7.)/3 - float32(4.)/3 - float32(1.) 
    fmt.Println(f32) 

    f64 := float64(7.)/3 - float64(4.)/3 - float64(1.) 
    fmt.Println(f64) 
} 

выходы:

-1.1920929e-07 
2.220446049250313e-16 

принимает абсолютное (без знака) значение f32 должны быть правильными.

+1

Вы знаете, откуда эта формула? или почему это работает? – sbditto85

+1

(7/3) - (4/3) является (3/3), полученным через «странные» числа с плавающей запятой, которые не могут быть представлены должным образом ... что -1 должно дать нам разницу ... Наверное? – sbditto85

+0

Несомненно, см. Проблему 3 здесь: http://rstudio-pubs-static.s3.amazonaws.com/13303_daf1916bee714161ac78d3318de808a9.html – Moustache

Смежные вопросы