<|im_start|>system
You are a helpful AI assistant.<|im_end|>
<|im_start|>user
Напиши функцию на языке C без нестандартных зависимостей по аналогии с этим описанием:
matrixFromNormal <point3>
Возвращает матрицу, у которой вектор локальной оси Z (т.е. нормаль) будет совпадать с заданным вектором <point3>. Компонент перемещения матрицы равен [0,0,0]. Величины компонента масштаба обратны значениям, требуемым для нормализации вектора <point3>.
Примеры работы функции (по смыслу):
MatrixFromNormal([0,0,1]) вернёт (matrix3 [1,0,0], [0,1,0], [0,0,1], [0,0,0])
MatrixFromNormal([0,1,1]) вернёт (matrix3 [0,-0.707107,0.707107] [1.41421,0,0] [0,1,1] [0,0,0])<|im_end|>
<|im_start|>assistant
Вот базовая реализация этой функции на языке С:

#include <math.h>

struct matrix3 {
  float x[3][3];
};

struct point3 {
  float x, y, z;
};

struct matrix3 MatrixFromNormal(struct point3 normal) {
  struct matrix3 result;

  float length = sqrt(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z);
  float invLength = 1.0f / length;

  result.x[0][0] = normal.x * invLength;
  result.x[0][1] = normal.y * invLength;
  result.x[0][2] = normal.z * invLength;

  result.x[1][0] = -normal.y * invLength;
  result.x[1][1] = normal.x * invLength;
  result.x[1][2] = 0;

  result.x[2][0] = -normal.z * invLength;
  result.x[2][1] = 0;
  result.x[2][2] = normal.x * invLength;

  return result;
}



Обратите внимание, что эта реализация предполагает, что входной вектор нормали не равен нулю и не является нулевым вектором. Вам может потребоваться добавить дополнительный код для обработки этих случаев, если они возможны в вашем случае использования.<|im_end|>
<|im_start|>user
Перепиши её на rust.<|im_end|>
<|im_start|>assistant
Вот код функции на Rust, аналогичный коду на C:

[Rust]
```
fn matrix_from_normal(normal: &[f32; 3]) -> [[f32; 3]; 3] {
    let mut result: [[f32; 3]; 3] = [[0f32; 3]; 3];
    let length = (normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]).sqrt() as f32;
    let inv_length = (1f32) / length;
    result[0][0] = normal[0] * inv_length;
    result[0][1] = normal[1] * inv_length;
    result[0][2] = normal[2] * inv_length;
    
    result[1][0] = -normal[1] * inv_length;
    result[1][1] = normal[0] * inv_length;
    result[1][2] = 0f32;
    
    result[2][0] = -normal[2] * inv_length;
    result[2][1] = 0f32;
    result[2][2] = normal[0] * inv_length;
    
    return result;
}
```<|im_end|>
<|im_start|>user
Как определить размер задействованной маржи на определенную цену в торговых сделках?<|im_end|>
<|im_start|>assistant
Для определения размера задействованной маржи на определённую цену в торговых сделках, необходимо знать следующие параметры:

1. Размер лота — это количество единиц базового актива, которые участвуют в сделке. Обычно он указывается в спецификации контракта.
2. Текущая цена базового актива — цена, по которой можно купить или продать базовый актив на рынке.
3. Уровень маржи — это процент от полной стоимости позиции, который требуется для открытия сделки. Уровень маржи определяется брокером и может различаться в зависимости от типа актива и волатильности рынка.
4. Кредитное плечо — это отношение размера позиции к размеру задействованной маржи. Например, если у вас есть задействованная маржа в размере 1000 долларов, а размер позиции составляет 10 000 долларов, то ваше кредитное плечо будет равно 1:10.

Для расчёта размера задействованной маржи на определённую цену можно воспользоваться следующей формулой:

Размер задействованной маржи = (Размер лота * Текущая цена базового актива) / Кредитное плечо

Например, предположим, что у вас есть задействованная маржа в размере 1000 долларов, кредитное плечо 1:10, размер лота равен 100 единицам базового актива, а текущая цена базового актива составляет 50 долларов за единицу. Тогда размер задействованной маржи будет равен:

(100 x 50) / 10 = 500 долларов

Таким образом, для открытия такой позиции вам потребуется задействовать маржу в размере 500 долларов.<|im_end|>