使用c中的math.h函数不能使用double到int转换

时间:2015-04-27 20:13:48

标签: c int double type-conversion math.h

dataBuf[1] = acos(0.130f);

这是我正在运行的代码,但是当我打印出结果时,它显示为1而不是82. dataBuf是一个int16_t数组。所有其他math.h函数在转换时都能正常工作,但是trig函数不起作用。

2 个答案:

答案 0 :(得分:2)

math.h中的三角函数使用弧度,而不是度。您可以通过乘以180 / pi,(57.29577951308232)将弧度转换为度数。

acos(0.13)会返回1.440427347091751个弧度,乘以57.29577951308232会得到82.53040768358306度的结果。

答案 1 :(得分:0)

OP期望结果以度为单位acos()以弧度为单位返回结果,@Antti Haapala也解释了这一结果。

此外,OP代码经历int截断而不是舍入。示例:尝试计算90度的结果时。 acos(0) - > 1.570796...。当此值转换为度数时,结果可能会比90.0中的89.999999999...int16_t。如果将其转换为90,结果将被截断为89而不是dataBuf[1] = (int16_t) round(acos(0.130f) * 180/M_PI);` // or using float functions const float r2d = 180/M_PI; dataBuf[1] = (int16_t) roundf(acosf(0.130f) * r2d);` 所希望的结果。在转换为整数之前,最好舍入浮点值。

typealias DisplayLinkCallback = @objc_block ( CVDisplayLink!, UnsafePointer<CVTimeStamp>, UnsafePointer<CVTimeStamp>, CVOptionFlags, UnsafeMutablePointer<CVOptionFlags>, UnsafeMutablePointer<Void>)->Void

func DisplayLinkSetOutputCallback( displayLink:CVDisplayLink, callback:DisplayLinkCallback )
{
    let block:DisplayLinkCallback = callback
    let myImp = imp_implementationWithBlock( unsafeBitCast( block, AnyObject.self ) )
    let callback = unsafeBitCast( myImp, CVDisplayLinkOutputCallback.self )

    CVDisplayLinkSetOutputCallback( displayLink, callback, UnsafeMutablePointer<Void>() )
}


let dl:CVDisplayLink? = {
    var linkRef:Unmanaged<CVDisplayLink>?
    CVDisplayLinkCreateWithActiveCGDisplays( &linkRef )

    return linkRef?.takeUnretainedValue()
}()

let callback = { (
    _:CVDisplayLink!,
    _:UnsafePointer<CVTimeStamp>,
    _:UnsafePointer<CVTimeStamp>,
    _:CVOptionFlags,
    _:UnsafeMutablePointer<CVOptionFlags>,
    _:UnsafeMutablePointer<Void>)->Void in

    println("yep")

}

DisplayLinkSetOutputCallback( dl!, callback )
CVDisplayLinkStart( dl! )

NSRunLoop.mainRunLoop().run()