Objective-C 中 判断 NaN

本文探讨了Objective-C播放器中播放时间在视频结束后显示为NaN的问题。介绍了NaN的概念及其在浮点数中的表示方式,并提供了一个检查是否为NaN的方法。

今天在弄一个Objective-C的播放器,碰到一个 播放时间 在视频播放完之后会显示为NaN的问题

 NaN,是Not a Number的缩写。

  NaN 用于处理计算中出现的错误情况,

比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。

//可以用下面方法 isnan(x)


Calling SDPT3 4.0: 82 variables, 40 equality constraints For improved efficiency, SDPT3 is solving the dual problem. ------------------------------------------------------------ num. of constraints = 40 dim. of sdp var = 40, num. of sdp blk = 20 dim. of linear var = 22 ******************************************************************* SDPT3: Infeasible path-following algorithms ******************************************************************* version predcorr gam expon scale_data HKM 1 0.000 1 0 it pstep dstep pinfeas dinfeas gap prim-obj dual-obj cputime ------------------------------------------------------------------- 0|0.000|0.000|4.5e+01|4.5e+00|4.9e+12| 3.000000e+11 0.000000e+00| 0:0:00| chol 1 1 1|0.989|0.975|9.3e+01|1.1e-01|1.8e+11| 3.776753e+10 -1.823606e-14| 0:0:00| chol 1 1 2|0.989|0.989|1.0e+00|1.2e-03|2.0e+09| 4.973382e+08 -1.823644e-14| 0:0:00| chol 1 1 3|0.984|0.989|1.7e-02|1.4e-05|2.6e+07| 8.248717e+06 -1.823732e-14| 0:0:00| chol 1 2 4|0.837|1.000|2.9e-03|1.3e-10|3.3e+06| 2.071204e+06 -2.250230e-14| 0:0:00| chol 2 2 5|0.977|1.000|7.5e-05|5.9e-11|1.7e+05| 1.243212e+05 -2.475121e-14| 0:0:00| chol 1 1 6|0.985|1.000|1.2e-06|4.6e-11|4.7e+03| 3.832586e+03 -2.544337e-14| 0:0:00| chol 1 1 7|0.985|1.000|1.8e-08|4.1e-11|1.2e+02| 1.039887e+02 -2.637470e-14| 0:0:00| chol 1 1 8|0.986|1.000|2.7e-10|3.8e-11|3.0e+00| 2.651099e+00 -2.762357e-14| 0:0:00| chol 1 1 9|0.986|1.000|4.0e-12|3.7e-11|7.4e-02| 6.549016e-02 -2.932940e-14| 0:0:00| chol 1 1 10|0.986|1.000|5.8e-14|1.0e-12|1.6e-03| 1.597406e-03 -3.177462e-14| 0:0:00| chol 1 1 11|0.989|1.000|6.5e-16|1.0e-12|1.8e-05| 1.774781e-05 -3.180134e-14| 0:0:00| chol 1 1 12|0.985|1.000|9.9e-18|1.0e-12|4.1e-07| 4.002336e-07 -4.598297e-14| 0:0:00| chol 1 1 13|0.939|1.000|6.0e-19|1.0e-12|2.8e-08| 2.747056e-08 -6.246802e-14| 0:0:00| chol 1 1 14|0.881|1.000|7.2e-20|1.0e-12|3.6e-09| 3.433513e-09 -1.071914e-13| 0:0:00| stop: max(relative gap, infeasibilities) < 1.49e-08 ------------------------------------------------------------------- number of iterations = 14 primal objective value = 3.43351297e-09 dual objective value = -1.07191363e-13 gap := trace(XZ) = 3.55e-09 relative gap = 3.55e-09 actual relative gap = 3.43e-09 rel. primal infeas (scaled problem) = 7.17e-20 rel. dual " " " = 1.00e-12 rel. primal infeas (unscaled problem) = 0.00e+00 rel. dual " " " = 0.00e+00 norm(X), norm(y), norm(Z) = 7.4e-10, 1.5e+09, 2.2e+10 norm(A), norm(b), norm(C) = 1.1e+01, 1.0e+00, 2.2e+10 Total CPU time (secs) = 0.05 CPU time per iteration = 0.00 termination code = 0 DIMACS: 7.2e-20 0.0e+00 1.1e-12 0.0e+00 3.4e-09 3.6e-09 ------------------------------------------------------------------- ------------------------------------------------------------ Status: Solved Optimal value (cvx_optval): +0.00221993 测试1-只有能耗: Solved Calling SDPT3 4.0: 112 variables, 50 equality constraints For improved efficiency, SDPT3 is solving the dual problem. ------------------------------------------------------------ num. of constraints = 50 dim. of sdp var = 60, num. of sdp blk = 30 dim. of linear var = 22 ******************************************************************* SDPT3: Infeasible path-following algorithms ******************************************************************* version predcorr gam expon scale_data HKM 1 0.000 1 0 it pstep dstep pinfeas dinfeas gap prim-obj dual-obj cputime ------------------------------------------------------------------- 0|0.000|0.000|6.3e+01|4.5e+00|4.9e+12| 2.999980e+11 0.000000e+00| 0:0:00| chol 1 1 1|0.000|0.000|6.3e+01|4.5e+00|4.9e+12| 2.999978e+11 -2.988746e-20| 0:0:00| chol 1 2 2|0.000|0.000|6.3e+01|4.5e+00|4.9e+12| 2.999978e+11 -9.419087e-19| 0:0:00| chol 1 1 3|0.000|0.000|6.3e+01|4.5e+00|4.9e+12| 2.999962e+11 -2.203428e-17| 0:0:00| chol 1 1 4|0.000|0.000|6.3e+01|4.5e+00|4.9e+12| 2.999608e+11 -4.948138e-16| 0:0:00| *** Too many tiny steps: restarting with the following iterate. *** [X,y,Z] = infeaspt(blk,At,C,b,2,1e5); chol 1 2 5|0.000|0.000|6.3e+05|1.0e+00|2.2e+12| 2.446634e+16 -2.161569e-17| 0:0:00| *** Too many tiny steps even after restarting stop: steps too short consecutively* ------------------------------------------------------------------- number of iterations = 5 primal objective value = 2.99996157e+11 dual objective value = -2.20342799e-17 gap := trace(XZ) = 4.92e+12 relative gap = 1.64e+01 actual relative gap = 1.00e+00 rel. primal infeas (scaled problem) = 6.32e+01 rel. dual " " " = 4.51e+00 rel. primal infeas (unscaled problem) = 0.00e+00 rel. dual " " " = 0.00e+00 norm(X), norm(y), norm(Z) = 3.0e+05, 3.5e+05, 1.0e+11 norm(A), norm(b), norm(C) = 1.2e+01, 1.0e+00, 2.2e+10 Total CPU time (secs) = 0.04 CPU time per iteration = 0.01 termination code = -5 DIMACS: 6.3e+01 0.0e+00 5.0e+00 0.0e+00 1.0e+00 1.6e+01 ------------------------------------------------------------------- ------------------------------------------------------------ Status: Failed Optimal value (cvx_optval): NaN 测试2-添加无用inv_pos: Failed
最新发布
10-15
SDPT3是用于求解半定规划(SDP)问题的软件包,在求解过程中多次出现“Too many tiny steps”以及求解失败可能由以下原因导致: ### 问题本身的性质 - **问题病态性**:若半定规划问题的约束矩阵或目标函数具有病态性质,例如矩阵的条件数很大,就会使得求解过程变得不稳定。在这种情况下,算法可能需要进行非常小的步长迭代来保证收敛,从而导致出现“Too many tiny steps”的警告。最终,由于病态问题可能会导致数值误差不断累积,使得算法无法找到满足收敛条件的解,进而求解失败。 - **问题不可行或无界**:当问题本身不可行,即不存在满足所有约束条件的解,或者问题是无界的,即目标函数可以无限优化时,SDPT3 在迭代过程中会陷入困境。算法可能会不断尝试寻找可行解或优化目标函数,但由于问题的本质特性,最终无法得到有效的结果,表现为多次出现小步长迭代且求解失败。 ### 参数设置问题 - **步长参数**:SDPT3 算法中的步长参数控制着每次迭代的更新幅度。如果步长参数设置得太小,算法会进行大量的小步长迭代,从而出现“Too many tiny steps”的情况。相反,如果步长参数设置得太大,算法可能会跳过最优解,导致无法收敛,最终求解失败。 - **收敛容差**:收敛容差是判断算法是否收敛的一个重要指标。如果收敛容差设置得过于严格,算法可能需要进行大量的迭代才能满足收敛条件,从而出现多次小步长迭代。而如果收敛容差设置得过于宽松,可能会导致算法在未找到真正的最优解时就提前终止,也可能出现求解失败的情况。 ### 数值计算误差 - **浮点数精度限制**:在计算机中,浮点数的表示存在一定的精度限制。当问题的规模较大或者矩阵元素的值非常大或非常小时,浮点数运算可能会引入较大的误差。这些误差在迭代过程中不断累积,可能会影响算法的稳定性,导致出现小步长迭代和求解失败的问题。 - **矩阵分解误差**:SDPT3 在求解过程中通常会进行矩阵分解操作,如 Cholesky 分解等。如果矩阵的条件数较大或者矩阵存在数值不稳定的情况,矩阵分解可能会出现误差,进而影响算法的收敛性,导致求解过程中出现问题。 以下是一个简单的 Python 代码示例,使用 CVXPY 库调用 SDPT3 求解一个简单的半定规划问题: ```python import cvxpy as cp import numpy as np # 定义问题参数 n = 3 P = np.random.randn(n, n) P = P.T @ P # 确保 P 是半正定矩阵 # 定义变量 X = cp.Variable((n, n), PSD=True) # 定义目标函数 objective = cp.Minimize(cp.trace(P @ X)) # 定义约束条件 constraints = [X[0, 0] >= 1] # 定义问题 prob = cp.Problem(objective, constraints) # 求解问题 try: prob.solve(solver=cp.SDPT3) print("Optimal value:", prob.value) print("Optimal solution:", X.value) except Exception as e: print("Solver failed:", e) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值