And*_*itz 2 math double quadratic ios swift
我尝试为二次公式创建 x 值计算器。
代码:
var firstXValueVAR = 1.0
var secondXValueVAR = 1.0
var squaredValueVAR = 1.0
var firstOperationValueVAR = "+"
var secondOperationValueVAR = "+"
var constantValueVAR = 0.0
var topFormula = 0.0
var topFormula2 = 0.0
var bottomFormula = 0.0
var TotalSquaredValue = 0
var bSquared = 0
var totalX = 0.0
var totalX2 = 0.0
Run Code Online (Sandbox Code Playgroud)
接下来,当我单击“Go”计算 X 时,我得到了这个,我不太确定我做错了什么,但每次我打印 X 时,它都会显示 nan,并且它还显示对于 topFormula 和 topFormula2 (=南)。
func updateValues(){
var secondXValueInt = Int(secondXValueVAR)
var firstXValueInt = Int(firstXValueVAR)
var squaredValueInt = Int(squaredValueVAR)
var constantValueInt = Int(constantValueVAR)
bSquared = secondXValueInt << 2
TotalSquaredValue = firstXValueInt << squaredValueInt
firstXValueVAR = Double(firstXValue.text!)!
secondXValueVAR = Double(secondXValue.text!)!
squaredValueVAR = Double(squaredValue.text!)!
constantValueVAR = Double(constantValue.text!)!
if operations.contains(firstOperationValue.text!){
firstOperationValueVAR = firstOperationValue.text!
if secondOperationValueVAR == "*"{
topFormula = -(secondXValueVAR) + sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX = topFormula / bottomFormula
print(squaredValue)
topFormula2 = -(secondXValueVAR) - sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX2 = topFormula2 / bottomFormula
print(topFormula)
print(topFormula2)
print(bottomFormula)
print("X = \(totalX) & \(totalX2)")
}
if secondOperationValueVAR == "/"{
topFormula = -(secondXValueVAR) + sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX = topFormula / bottomFormula
print(squaredValue)
topFormula2 = -(secondXValueVAR) - sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX2 = topFormula2 / bottomFormula
print(topFormula)
print(topFormula2)
print(bottomFormula)
print("X = \(totalX) & \(totalX2)")
}
if secondOperationValueVAR == "+"{
topFormula = -(secondXValueVAR) + sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX = topFormula / bottomFormula
print(squaredValue)
topFormula2 = -(secondXValueVAR) - sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX2 = topFormula2 / bottomFormula
print(topFormula)
print(topFormula2)
print(bottomFormula)
print("X = \(totalX) & \(totalX2)")
}
if secondOperationValueVAR == "-"{
topFormula = -(secondXValueVAR) + sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX = topFormula / bottomFormula
print(squaredValue)
topFormula2 = -(secondXValueVAR) - sqrt(Double(bSquared) - (4 * firstXValueVAR * constantValueVAR))
bottomFormula = 2 * firstXValueVAR
totalX2 = topFormula2 / bottomFormula
print(topFormula)
print(topFormula2)
print(bottomFormula)
print("X = \(totalX) & \(totalX2)")
}
}
if operations.contains(secondOperationValue.text!){
secondOperationValueVAR = secondOperationValue.text!
}
}
@IBAction func GoAction(sender: AnyObject) {
updateValues()
}
Run Code Online (Sandbox Code Playgroud)
关键问题是您正在使用sqrt,它无法处理负数,因为结果是一个虚数。因此,它表明它“不是一个数字”( nan)。例如,3 - sqrt(4)是1,但3 - sqrt(-4)确实是3 - 2i。但该sqrt函数无法为您执行此操作,因此您要么必须使用处理虚数的库,要么自己手动处理。
与该错误无关的几个问题nan:
您正在根据 的内容进行设置firstXValueInt(以及其他类似变量) ,但是在执行此操作之后,您将重新从 中检索。这看起来倒退了。首先从文本字段获取值,然后开始进行计算。IntfirstXValueVARfirstXValueVARUITextField
您将文本字段值转换为 a Double,然后将其转换为 an,Int以便您可以使用按位移位运算符对其进行平方。当然,如果您确信这些值永远不会包含非整数值,那么您可以这样做,但这是一个巨大的限制,以便您可以享受按位移位操作的效率。另外,按位运算并没有按照我认为您认为的那样进行。相当于<< 2乘以四,而不是平方。
如果您真的那么关心效率,我不会多次重新计算判别式。就我个人而言,我建议放弃这种整数转换并避免一整类可能的问题。
我不明白为什么您似乎要根据 的值重复计算 oftotalX和四次代码。如果你打算这样做,我要么转向-模式(或者更好的是,一个声明),然后使用一个子句来检测是否未找到四个预期值。totalX2firstOperationValueifelse ifswitchdefault
无论如何,如果我想要这个二次公式的根,我会这样做:
let a = Double(firstXValue.text!)!
let b = Double(secondXValue.text!)!
let c = Double(constantValue.text!)!
let bSquared = b * b
let discriminant = bSquared - (4 * a * c)
let isImaginary = discriminant < 0
let discrimimantAbsSqrt = sqrt(fabs(discriminant))
if isImaginary {
print("X = (\(-b) + \(discrimimantAbsSqrt)i)/\(2*a) & (\(-b) - \(discrimimantAbsSqrt)i)/\(2*a)")
} else {
let topFormula = -b + discrimimantAbsSqrt
let bottomFormula = 2 * a
let totalX = topFormula / bottomFormula
let topFormula2 = -b - discrimimantAbsSqrt
let totalX2 = topFormula2 / bottomFormula
print("X = \(totalX) & \(totalX2)")
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码废弃了所有这些属性,并且仅使用局部变量(控件除外UITextField)。您可以通过确保只在真正需要的地方使用属性来最大程度地减少意外后果,而且我个人会将所有计算保留为局部变量。就我个人而言,我也会避免使用强制展开(the !)并进行条件绑定以优雅地处理nil值,但这取决于您。