#ifndef _BGC_DUAL_NUMBER_H_ #define _BGC_DUAL_NUMBER_H_ // =================== Types ==================== // typedef struct { float real, dual; } BGC_FP32_DualNumber; typedef struct { double real, dual; } BGC_FP64_DualNumber; // =================== Reset ==================== // inline void bgc_fp32_dual_number_reset(BGC_FP32_DualNumber* number) { number->real = 0.0f; number->dual = 0.0f; } inline void bgc_fp64_dual_number_reset(BGC_FP64_DualNumber* number) { number->real = 0.0; number->dual = 0.0; } // ==================== Make ==================== // inline void bgc_fp32_dual_number_make(BGC_FP32_DualNumber* number, const float real, const float dual) { number->real = real; number->dual = dual; } inline void bgc_fp64_dual_number_make(BGC_FP64_DualNumber* number, const double real, const double dual) { number->real = real; number->dual = dual; } // ==================== Copy ==================== // inline void bgc_fp32_dual_number_copy(BGC_FP32_DualNumber* destination, const BGC_FP32_DualNumber* source) { destination->real = source->real; destination->dual = source->dual; } inline void bgc_fp64_dual_number_copy(BGC_FP64_DualNumber* destination, const BGC_FP64_DualNumber* source) { destination->real = source->real; destination->dual = source->dual; } // ==================== Swap ==================== // inline void bgc_fp32_dual_number_swap(BGC_FP32_DualNumber* first, BGC_FP32_DualNumber* second) { first->real = second->real; first->dual = second->dual; } inline void bgc_fp64_dual_number_swap(BGC_FP64_DualNumber* first, BGC_FP64_DualNumber* second) { first->real = second->real; first->dual = second->dual; } #endif