Тип C.double

Тип C.double в пакете cgo соответствует типу double из языка C и представляет собой 64-битное число с плавающей точкой (IEEE 754). Этот тип используется при передаче вещественных чисел двойной точности между Go и C функциями. В Go ему соответствует встроенный тип float64, поэтому преобразование между ними выполняется неявно при передаче значений в вызовах C функций.

При работе с C.double важно помнить, что этот тип является алиасом к float64 в Go, но используется в контексте cgo для явного указания на соответствие C типу double. Это позволяет компилятору правильно генерировать код для взаимодействия между двумя языками.

Синтаксис

govar d C.double
d = 3.14159
// или сразу с инициализацией
pi := C.double(3.14159)

Пример

Давайте создадим переменную типа C.double, присвоим ей значение и выведем его в консоль:

gopackage main

import "fmt"

/*
  #include <math.h>
*/
import "C"

func main() {
  var num C.double
  num = 2.71828
  fmt.Printf("Значение num: %f\n", num)
}

Результат выполнения кода:

go"Значение num: 2.718280"

Пример

Тип C.double может использоваться для передачи чисел в C функции. Рассмотрим пример вызова математической функции sqrt из библиотеки math.h:

gopackage main

import "fmt"

/*
  #include <math.h>
*/
import "C"

func main() {
  value := C.double(16.0)
  result := C.sqrt(value)
  fmt.Printf("Квадратный корень из 16: %f\n", result)
}

Результат выполнения кода:

go"Квадратный корень из 16: 4.000000"

Пример

Тип C.double также может быть получен как результат работы C функции. В этом примере мы вычисляем синус числа с помощью C функции sin:

gopackage main

import "fmt"

/*
  #include <math.h>
*/
import "C"

func main() {
  angle := C.double(0.785398) // π/4
  sinValue := C.sin(angle)
  fmt.Printf("Синус π/4: %f\n", sinValue)
}

Результат выполнения кода:

go"Синус π/4: 0.707107"

Пример

При работе с C.double можно выполнять арифметические операции, как с обычными числами в Go, но с учетом того, что результат также будет иметь тип C.double:

gopackage main

import "fmt"

import "C"

func main() {
  a := C.double(5.5)
  b := C.double(2.2)
  sum := a + b
  diff := a - b
  prod := a * b
  quot := a / b

  fmt.Printf("Сумма: %f\n", sum)
  fmt.Printf("Разность: %f\n", diff)
  fmt.Printf("Произведение: %f\n", prod)
  fmt.Printf("Частное: %f\n", quot)
}

Результат выполнения кода:

go"Сумма: 7.700000"
"Разность: 3.300000"
"Произведение: 12.100000"
"Частное: 2.500000"

Смотрите также

  • тип C.float,
    который соответствует типу float из C (32-битное число)
  • тип C.int,
    который соответствует типу int из C (32-битное целое)
  • тип C.long,
    который соответствует типу long из C (размер зависит от платформы)
  • раздел call-c,
    в котором подробно описаны все аспекты вызова C функций из Go