Нечетное деление приводит к быстрому [дублированию]

Тип математики с плавающей запятой, которая может быть реализована на цифровом компьютере, обязательно использует приближение действительных чисел и операций над ними. (Стандартная версия стандартная работает до более чем пятидесяти страниц документации и имеет комитет для рассмотрения ее ошибок и дальнейшего уточнения.)

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

Если вам нужна бесконечная точность (например, вместо числа π одного из его более коротких резервных копий), вы должны написать или использовать символическую математическую программу.

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

1
задан Moritz 13 February 2016 в 18:41
поделиться

3 ответа

Ваш код выполняет целочисленное деление, беря целочисленный результат и преобразовывая его в double. Вместо этого вы хотите преобразовать эти отдельные целые числа в двойные, а затем выполнить деление. Например.

let result = Double(myInt!) / Double(lutning) * pi

Или определите

let lutning = 360.0

, а затем

let result = Double(myInt!) / lutning * pi

И, BTW, я бы предложил использовать M_PI, а не определять ваши собственный pi.

let result = Double(myInt!) / lutning * M_PI
2
ответ дан Rob 28 August 2018 в 22:32
поделиться

В строке let result = (Double(myInt! / lutning) * Double(pi)) вы добавили свой тип к double после , разделив два целых числа, чтобы ваш результат всегда был равен нулю. Вы должны сделать их удвоенными до деления.

let result = (Double(myInt!) / Double(lutning)) * Double(pi))

0
ответ дан Cole 28 August 2018 в 22:32
поделиться

Вы делите Int на Int.

Целые деления округляются до ближайшего целого числа к нулю. Поэтому, например, 359/360 не является числом, близким к 1, оно равно 0. 360/360 до 719/360 равно 1. 720/360 до 1079/360 равно 2 и так далее.

Но ваше использование опций является жестоким. Я бы написал

let myInt = Int(graderna.text!)
let myInt2 = Int(radien.text!)

if let realInt = myInt, realInt2 = myInt2 {
    let pi = 3.1415926
    let lutning = 360.0

    let result = Double (realInt) * (pi / lutning)
    svar2.text = "\(result)"
}
1
ответ дан gnasher729 28 August 2018 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: